c ++构造函数/析构函数

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,我得到了相同的结果.〜

Pau*_*zie 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";
}
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删除副本所致.

但问题是,您实际上无法预测复制构造函数的调用次数.如您所见,未经优化的版本也可以正常工作.