我有以下代码:
#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";
}
当我运行它时。我得到以下输出:
缺点
完毕
dest
我期望的输出是:
缺点-> p已创建,
缺点->对于,gokul返回
dest-> p被破坏,gokul返回
完毕
dest->毁坏,主要返回
因为当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
当您更改为发布模式时,输出现在是这样的:
cons
done
dest
第二个输出没有副本构造的原因是由于Named Return Value Optimization
已完成删除副本的操作。
但是,关键是您真的无法预测复制构造函数被调用的次数。如您所见,未优化的版本也可以正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句