我有以下代码:
#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
我期待输出为:
缺点 - &gt; p创建,
缺点 - &gt;对于a,gokul返回
dest - &gt; p被毁了,gokul回来了
完成
dest - &gt;一个被毁坏的主要归还
作为局部变量&#34; p&#34;当函数gokul返回并且新变量&#34; a&#34;会被创造出来吗?我编写了所有三个标准03,11&amp; 14,我得到相同的结果。 〜
答案 0 :(得分:5)
您的代码无法跟踪复制构造函数。您需要这样做才能更好地了解何时创建对象。
#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
删除了副本。
但问题是,您实际上无法预测复制构造函数的调用次数。如您所见,未经优化的版本也可以正常工作。
答案 1 :(得分:0)
如果您已启用优化,那么由于编译器优化而获得此输出Form_Load
enter link description here
或者,如果您在调试模式下运行程序(没有优化),则不要只跟踪用作@PaulMcKenzie解释的复制构造函数。
您可以尝试编译而不进行优化:Copy Elision
(在visual studio中),/Od
在gcc中。或者只是在调试模式下运行。然后返回到-O0
或/O2
的优化版本。
请注意,如果您切换到非优化版本-O2
,那么从C ++ 11编译器可以使用移动构造函数,但仍然无法获得输出。所以你需要跟踪移动构造函数
/0d