为了账号安全,请及时绑定邮箱和手机立即绑定

如题,在下列代码中,输出的结果不会出现destructor,请问这是为什么?

如题,在下列代码中,输出的结果不会出现destructor,请问这是为什么?

C++
慕的地10843 2023-01-02 15:11:12
#include <iostream>using namespace std;class A{public:A();A(const A&);~A();void operator = (const A&);};A::A() {cout<<"default constructor called\n";}A::A(const A&){cout<<"copy constructor called\n";}A::~A(){cout<<"destructor called\n";}void A::operator = (const A&right_side){cout<<"assignment operator called\n";}A foo( A& anObj){cout<<"inside foo\n";return anObj;}int main(){A thing;A another = foo(thing);system("pause");return 0;}如果将foo 去掉&。变成A foo( A anObj){cout<<"inside foo\n";return anObj;}
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

析构函数是在对象销毁的时候被系统调用的。

另外,你这里说反了,如果去掉foo里面去掉&,就会多生成一个临时变量,foo结束后,这个对象会被析构,这时候就会多输入一个destructor。如果是原来的A foo(A& anObj)这里的参数是引用,则不会创建一个对象,也就没有所谓析构。所以引用不会多一个destructor

其实main里面里面也有定义两个A对象,在退出main的时候,也会被调用的,你在命令行里运行程序可以看到,程序结束后会有两个destructor输出:


default constructor calledinside foocopy constructor calleddestructor called // main函数里的A析构destructor called // main函数里的A析构Press any key to continue

这是我在VC中运行的结果。


查看完整回答
反对 回复 2023-01-06
?
森栏

TA贡献1810条经验 获得超5个赞

在该类生成的对象实例声明周期结束时,才被调用
析构函数,在定义类时,进行声明、定义,主要用来释放申请的资源,
如定义了指针变量,并对其进行空间分配( new XX ),就可以在析构函数中
释放资源。举例入下
class A
{
Class B pt ;

A()

{
pt = new B();

}
~A()
{
if( NULL != pt)

{
delete pt ;
pt = NULL;

}

}
}// end of class A

查看完整回答
反对 回复 2023-01-06
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

因为析构的时候你已经退出了,自然就显示不出来了,一般在new之后用delete可以看到结果

查看完整回答
反对 回复 2023-01-06
  • 3 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信