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

srxumin 2016-10-20 09:50:21
第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中试了一下是无法编译通过的,所以叫“伪码”?
...全文
172 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤奋的小游侠 2016-10-23
  • 打赏
  • 举报
回复
引用 10 楼 qq423399099 的回复:
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
我草,这个是什么垃圾帖子?这货随便复制一个答案就拿了四十分?其它人认真回答你的问题就一分二分。草
paschen 版主 2016-10-20
  • 打赏
  • 举报
回复
T c=a+b; 调用的是构造函数 而c=a+b; 调用的赋值运算符
paschen 版主 2016-10-20
  • 打赏
  • 举报
回复
temp.operator+(a,b); 多了一个参数 这个不是伪代码,这种调用相当于显示调用运算符重载 c.operator=(temp); 等价于 c = temp;
iyomumx 2016-10-20
  • 打赏
  • 举报
回复
这伪代码有点问题
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));
srxumin 2016-10-20
  • 打赏
  • 举报
回复
引用 楼主 srxumin 的回复:
第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 楼 lianshaohua 的回复:
这种代码可以编译通过的,只是需要一些条件,需要重载operator+;T可能是自己的类型或在模板中(还要改改声明)
两位大侠可以举个例子吗?
yshuise 2016-10-20
  • 打赏
  • 举报
回复
temp.T::~T(); =================== 这种代码是不能写在程序里。
yshuise 2016-10-20
  • 打赏
  • 举报
回复
楼主的意思是对的。伪码就是大概的意思,不一定能编过
ztenv 版主 2016-10-20
  • 打赏
  • 举报
回复
这种代码可以编译通过的,只是需要一些条件,需要重载operator+;T可能是自己的类型或在模板中(还要改改声明)
勤奋的小游侠 2016-10-20
  • 打赏
  • 举报
回复
可能通过,前提是你要定义一个class T,并重载它的+和= 操作符。
小灸舞 2016-10-20
  • 打赏
  • 举报
回复
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
SureGOGOGO 2016-10-20
  • 打赏
  • 举报
回复
引用 8 楼 paschen 的回复:
T c=a+b; 调用的是构造函数 而c=a+b; 调用的赋值运算符
引用 8 楼 paschen 的回复:
T c=a+b; 调用的是构造函数 而c=a+b; 调用的赋值运算符
请看拷贝gou'zhao
引用 8 楼 paschen 的回复:
T c=a+b; 调用的是构造函数 而c=a+b; 调用的赋值运算符
其实自己写个类去单步跟踪就能知道的了,调用的是重载的=,自己实现的

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧