Code Bye

看《深度探索C++对象模型》,对于临时对象的疑问

第268页讲的是临时对象,大致意思是说 T c=a+b;不会产生临时对象,而c=a+b;就会产生临时对象。然后作者写了以下几行“伪代码”:
//c++伪码
//T temp=a+b;
T temp;
temp.operator+(a,b); //(1)
//c=temp;
c.operator=(temp);//(2)
temp.T::~T();
(1)和(2)这两行假如是真实代码应该无法通过吧?本人在VC2015中试了一下是无法编译通过的,所以叫“伪码”?
解决方案

2

可能通过,前提是你要定义一个class T,并重载它的+和= 操作符。

2

这种代码可以编译通过的,只是需要一些条件,需要重载operator+;T可能是本人的类型或在模板中(还要改改声明)

5

题主的意思是对的。伪码就是大致的意思,不一定能编过

5

temp.T::~T();
===================
这种代码是不能写在程序里。

4

这伪代码有点问题
T temp = a + b;
//应该是
T temp(a + b);
//假如 operator+ 是成员重载那么就是 a.operator+(b)
T temp(operator+(a, b));

另外不能直接引入临时变量来说明临时对象,尤其是 C++11 以后,左值( lvalue )和临时值( xvalue )还是有区别的

//假设有
typedef std::string T;
T a, b, c;
//那么
c = a + b;
//相当于
c.operator=(std::operator+(a, b));

2

temp.operator+(a,b); 多了一个参数
这个不是伪代码,这种调用相当于显示调用运算符重载
c.operator=(temp);  等价于 c = temp;

1

引用:

T c=a+b; 调用的是构造函数
而c=a+b; 调用的赋值运算符

引用:

T c=a+b; 调用的是构造函数
而c=a+b; 调用的赋值运算符

请看拷贝gou”zhao

引用:

T c=a+b; 调用的是构造函数
而c=a+b; 调用的赋值运算符


其实本人写个类去单步跟踪就能知道的了,调用的是重载的=,本人实现的

40

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明看《深度探索C++对象模型》,对于临时对象的疑问