第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中试了一下是无法编译通过的,所以叫“伪码”?
//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;
这个不是伪代码,这种调用相当于显示调用运算符重载
c.operator=(temp); 等价于 c = temp;
1
请看拷贝gou”zhao
其实本人写个类去单步跟踪就能知道的了,调用的是重载的=,本人实现的
40
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。