sou*_*ics 0 c++ constructor destructor
我有以下代码:
#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";
}
Run Code Online (Sandbox Code Playgroud)
当我运行它.我得到以下输出:
缺点
DONE
DEST
我期待输出为:
缺点 - > p创建,
缺点 - >对于a,gokul返回
dest - > p被毁,gokul回来了
DONE
dest - >一个被毁坏的,主要归还
当函数gokul返回并且将创建新变量"a"时,将破坏局部变量"p",不是吗?我已经编译了所有三个标准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";
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2015中运行此代码时,没有优化,输出如下:
cons
copy constructed
dest
done
dest
Run Code Online (Sandbox Code Playgroud)
当您更改为发布模式时,输出现在是这样的:
cons
done
dest
Run Code Online (Sandbox Code Playgroud)
第二个输出没有复制结构的原因是由于Named Return Value Optimization删除副本所致.
但问题是,您实际上无法预测复制构造函数的调用次数.如您所见,未经优化的版本也可以正常工作.