C ++构造函数/析构函数

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";
}

当我运行吧。我得到以下输出:

缺点

完成

目的地

我期望输出是:

cons --> p 创建,

cons --> 对于 a,gokul 返回

dest --> p 销毁,gokul 返回

完成

dest --> 销毁,main 返回

因为局部变量 "p" 会在函数 gokul returns 和新变量 "a" 被创建时被销毁,不是吗?我用所有三个标准 03、11 和 14 进行了编译,得到了相同的结果。 ~

如果您启用了优化,那么由于编译器优化,您会得到此输出 Copy Elision enter link description here

或者,如果您 运行 您的程序处于调试模式(没有优化),您不会简单地跟踪使用 @PaulMcKenzie 解释的复制构造函数。

您可以尝试不进行优化编译:/Od(在 visual studio 中),-O0 在 gcc 中。或者只是 运行 在调试模式下。然后通过 /O2-O2.

回到优化版本

请注意,从 C++11 开始,如果您切换到非优化版本 /0d,编译器可以使用移动构造函数,但您仍然没有得到输出。所以你需要跟踪移动构造函数

A(const A&& o){
    cout << "move ctor" << endl;
}

您的代码未能跟踪复制构造函数。您需要这样做才能更好地了解对象的创建时间。

#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 Studio2015年运行这段代码,没有优化,输出如下:

cons
copy constructed
dest
done
dest

当您更改为释放模式时,输出现在是这样的:

cons
done
dest

第二个输出没有复制构造的原因是 Named Return Value Optimization 删除了复制。

然而,关键是你真的无法预测复制构造函数被调用了多少次。如您所见,未优化的版本也能正常工作。