C++类的临时对象和复制构造函数调用的问题

qhlzbzky 2012-07-06 04:41:11
#include <stdio.h>
#include <iostream>

using namespace std;

class B
{
public:
B()
{
cout << "default constructor" << endl;
}

~B()
{
cout << "destructed" << endl;
}

B(int i):data(i)
{
cout << "constructed by parameter " << data << endl;
}

B(B &b)
{
cout << "copy constructor" << endl;
data = b.data;
}

private:
int data;

};

B play(B b)
{
return b;
}


int main(void)
{
B t1 = play(5);


return 0;
}
当有析构函数的时候调用一次复制构造函数,当没有析构函数的时候调用两次复制构造函数,这是为什么?
...全文
201 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jowu604 2012-07-19
  • 打赏
  • 举报
回复
在析构函数里加一句cout<<this<<endl;看看吧
调试下就明白了,函数的调用顺序如下:
step1:
B t1 = play(5)
step2:
play(5)---->play(b(5))---->返回一个B对象值为5,地址为0x0012fe6c
step3:
将上面返回的对象赋给t1对象,
注意这里是复制构造函数,而非拷贝构造函数(copyconstruct为:B t1; t1=play(5))
&t1=0x1200fe60,经过复制后0x1200fe60的地址保存的值由-858993460改变为5
step4:析构
play(5)返回的对象要在复制构造函数后马上析构
而t1在离开函数作用域析构
qhlzbzky 2012-07-19
  • 打赏
  • 举报
回复
谢谢W170532934(笨笨熊)的提醒,汇编懂一点点,学习一下!
一秒一次郎 2012-07-16
  • 打赏
  • 举报
回复
小弟初学,发表一下我的看法

1、如果有参数的情况下 play(5) -> play(B b(5)) -> =t1 [此处调用构造函数]

2、如果无参数的情况下 play() -> play(B B()) [此处调用构造函数] -> =t1 [此处调用构造函数]
W170532934 2012-07-16
  • 打赏
  • 举报
回复
这类问题,建议楼主单步调试,然后转到反汇编。看汇编代码。不然对编译器给你优化后的代码和书本上看到的是有很大差异的。
fzamygsd 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
看了你的文章,感觉受益匪浅,但是还有个问题不太清楚,你提到“返回对象直接使用为sum预留的空间,所以减少了返回临时对象的生成——返回对象即是sum,返回对象的创建即是sum对象的创建 ”,我想问下这里的内存分配与数据传输是如何进行的?
[/Quote]
楼主懂汇编不
qhlzbzky 2012-07-15
  • 打赏
  • 举报
回复
看了你的文章,感觉受益匪浅,但是还有个问题不太清楚,你提到“返回对象直接使用为sum预留的空间,所以减少了返回临时对象的生成——返回对象即是sum,返回对象的创建即是sum对象的创建 ”,我想问下这里的内存分配与数据传输是如何进行的?
5t4rk 2012-07-06
  • 打赏
  • 举报
回复
http://blog.csdn.net/bjtbjt/article/details/6740475

临时对象问题参考,看了你会懂得

65,180

社区成员

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

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