我有以下代码:
#include <iostream>
using namespace std;
class A
{
public:
A ()
{
cout<<"cons"<<endl;
}
~A ()
{
cout<<"dest"<<endl;
}
};
A
gokul (void)
{
A p;
return p;
}
int
main ()
{
A a = gokul();
cout<<"done\n";
}
当我运行它时。我得到以下输出:
缺点
完成
目的地
我期望的输出是:
缺点 --> p 创建,
缺点 --> 对于 a,gokul 返回
dest --> p 销毁,gokul 返回
完成
dest --> 销毁,main 返回
当函数 gokul 返回时,局部变量“p”将被销毁,新变量“a”将被创建,不是吗?我用所有三个标准 03、11 和 14 进行了编译,得到了相同的结果。 ~
最佳答案
您的代码未能跟踪复制构造函数。您需要这样做才能更好地了解对象的创建时间。
#include <iostream>
using namespace std;
class A
{
public:
A() { cout<<"cons"<<endl; }
~A() { cout<<"dest"<<endl; }
A(const &A) { cout << "copy constructed" << endl;}
};
A gokul (void)
{
A p;
return p;
}
int main ()
{
A a = gokul();
cout<<"done\n";
}
当您在 Visual Studio 2015 中运行此代码时,没有优化,输出如下:
cons
copy constructed
dest
done
dest
当你切换到 Release模式时,输出现在是这样的:
cons
done
dest
第二个输出没有拷贝构造的原因是由于为删除拷贝而完成的命名返回值优化
。
然而关键是你真的无法预测复制构造函数被调用了多少次。如您所见,未优化的版本也能正常工作。
关于C++构造函数/析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673761/