为什么执行了三次析构?

hope2reality 2015-04-22 06:35:21

#include <iostream>
using namespace std;
class A
{
private:
int data;
public:
A(){cout<<"默认构造"<<endl;}
A(int i):data(i){ cout<<"参数构造"<<data<<endl;}
A(const A &b){ data=b.data; cout<<"拷贝构造"<<data<<endl;}
~A(){ cout<<"析构"<<endl;}
};
A play(A a)
{
return a;
}
int main(void)
{
A temp;
temp=play(5);
return 0;
}



我只知道会执行两次析构。第一次是play(5)产生对象的析构,第二次是temp的析构,那还有一次的析构是怎么发生的呢?
如果将程序改成A temp=play(5);就会执行两次构造,两次析构,为什么在这种情况下少了一次析构?
...全文
172 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hope2reality 2015-04-23
  • 打赏
  • 举报
回复
恩,我懂了。本来我以为拷贝构造是发生在给temp赋值的时候,所以找不到三次析构。原来第三次构造函数是发生在play函数返回时
hope2reality 2015-04-23
  • 打赏
  • 举报
回复
引用 2 楼 wanghailong_hailong 的回复:
#include <iostream> using namespace std; class A { private: int data; public: A(){cout<<"默认构造"<<endl;} A(int i):data(i){ cout<<"参数构造"<<data<<endl;} A(const A &b){ data=b.data; cout<<"拷贝构造"<<data<<endl;} ~A(){ cout<<"析构"<<endl;} }; A play(A a) { return a; //1.这里return出去以后,这个函数调用完毕会执行第一次析构(那个参数a的) } int main(void) { A temp; //3.这里是最后一次析构 temp=play(5); //2.这里接收到那个返回的对象用完以后还会调用一次析构 return 0; }//程序退出 最后执行main内定义的temp对象的析构,共三次
返回的对象和参数a不是同一个吗?
william7_138 2015-04-23
  • 打赏
  • 举报
回复
引用 7 楼 gk405128494 的回复:
[quote=引用 6 楼 william7_138 的回复:] 编译器会把

A play(A a)
{
	return a;
}
这个函数改成成类似于这样

void paly(A& result_, A a)
{
    result.A(a); //这里调用了传说中的拷贝构造函数
}
这里为返回值又构造了一个临时变量,所以出现了三次构造,三次析构
拷贝构造应该是temp=play(5)产生的,就是给temp赋值的时候[/quote] 这位同学,不好意思,这里我有一点不同意见,temp=play(5),是调用的默认的operator=,拷贝构造,注意它的构造二字,是指类对象在定义的时候调用的,此处你的temp已经构造好了,这只是一个赋值语句。我所说的解释,是我单步调试看的反汇编得出来的,而且我使用了VC和GCC两个编译器得出的答案。关于函数返回值的处理,你也可以看《深度探索C++对象模型这本书》。
hope2reality 2015-04-23
  • 打赏
  • 举报
回复
引用 6 楼 william7_138 的回复:
编译器会把

A play(A a)
{
	return a;
}
这个函数改成成类似于这样

void paly(A& result_, A a)
{
    result.A(a); //这里调用了传说中的拷贝构造函数
}
这里为返回值又构造了一个临时变量,所以出现了三次构造,三次析构
拷贝构造应该是temp=play(5)产生的,就是给temp赋值的时候
william7_138 2015-04-22
  • 打赏
  • 举报
回复
编译器会把

A play(A a)
{
	return a;
}
这个函数改成成类似于这样

void paly(A& result_, A a)
{
    result.A(a); //这里调用了传说中的拷贝构造函数
}
这里为返回值又构造了一个临时变量,所以出现了三次构造,三次析构
breakfisher 2015-04-22
  • 打赏
  • 举报
回复
如果将程序改成A temp=play(5);就会执行两次构造,两次析构,为什么在这种情况下少了一次析构? ---少了 A temp的那次默认构造
breakfisher 2015-04-22
  • 打赏
  • 举报
回复
int main(void) { A temp; //1.构造了一个对象temp; temp=play(5); //2.首先构造一个临时对象(5)作为 play函数的参数 return 0; } A play(A a) { return a; // 3.在函数play内, 当其返回时构造了一个临时对象作为返回值 } 析构函数与构造函数一一对应。 所以也是三次
mewiteor 2015-04-22
  • 打赏
  • 举报
回复
构造与析构一一对应
生活的苦涩 2015-04-22
  • 打赏
  • 举报
回复
#include <iostream> using namespace std; class A { private: int data; public: A(){cout<<"默认构造"<<endl;} A(int i):data(i){ cout<<"参数构造"<<data<<endl;} A(const A &b){ data=b.data; cout<<"拷贝构造"<<data<<endl;} ~A(){ cout<<"析构"<<endl;} }; A play(A a) { return a; //1.这里return出去以后,这个函数调用完毕会执行第一次析构(那个参数a的) } int main(void) { A temp; //3.这里是最后一次析构 temp=play(5); //2.这里接收到那个返回的对象用完以后还会调用一次析构 return 0; }//程序退出 最后执行main内定义的temp对象的析构,共三次
iyomumx 2015-04-22
  • 打赏
  • 举报
回复
    A temp = play(5);// A(const A &b)
    temp = play(5);//operator=(const A& other)

64,651

社区成员

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

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