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

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

缺点

完成

目的地

我期望的输出是:

缺点 --> p 创建,

缺点 --> 对于 a,gokul 返回

dest --> p 销毁,gokul 返回

完成

dest --> 销毁,main 返回

当函数 gokul 返回时,局部变量“p”将被销毁,新变量“a”将被创建,不是吗?我用所有三个标准 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";
}

当您在 Visual Studio 2015 中运行此代码时,没有优化,输出如下:

cons
copy constructed
dest
done
dest

当你切换到 Release模式时,输出现在是这样的:

cons
done
dest

第二个输出没有拷贝构造的原因是由于为删除拷贝而完成的命名返回值优化

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

关于C++构造函数/析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673761/

相关文章:

c++ - 在析构函数中捕获异常

c++ - 尝试运行程序时出现错误图像错误

c++ - 访问列表项时的 UI 和工作线程同步

c++ - 实现析构函数

c++ - 类能否在其成员初始化列表中初始化其非立即基类?

c++ - 为什么我的析构函数被调用,我该如何修复它

c++ - 显式删除析构函数而不调用 delete

c++ - 为什么我的 openGL 顶点缓冲对象不绘制任何东西?

c++ - 同一文件中已有变量的 undefined reference 链接器错误

c++ - 为什么为派生类定义拷贝构造函数要求定义基类的默认构造函数?