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

时间:2016-04-17 07:22:47

标签: 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";
}

当我跑的时候。我得到以下输出:

缺点

完成

DEST

我期待输出为:

缺点 - &gt; p创建,

缺点 - &gt;对于a,gokul返回

dest - &gt; p被毁了,gokul回来了

完成

dest - &gt;一个被毁坏的主要归还

作为局部变量&#34; p&#34;当函数gokul返回并且新变量&#34; a&#34;会被创造出来吗?我编写了所有三个标准03,11&amp; 14,我得到相同的结果。 〜

2 个答案:

答案 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