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

汤基仿生学

我有以下代码:

#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

我期望的输出是:

缺点-> p已创建,

缺点->对于,gokul返回

dest-> p被破坏,gokul返回

完毕

dest->毁坏,主要返回

因为当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

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

cons
done
dest

第二个输出没有副本构造的原因是由于Named Return Value Optimization已完成删除副本的操作。

但是,关键是您真的无法预测复制构造函数被调用的次数。如您所见,未优化的版本也可以正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

限制对C ++构造函数和析构函数的访问

关于结构构造函数和析构函数的行为-C ++

C ++中的析构函数和构造函数排序

c ++复制构造函数和析构函数

为什么在构造时调用C ++类的析构函数?

[c ++]缺少析构函数

C ++析构函数约定

链表析构函数C ++

覆盖析构函数-C ++

没有析构函数的C ++函数

在UML类图中为C ++类添加构造函数和析构函数

基于C ++堆栈的构造函数/析构函数无法按预期工作

C ++自动生成带有用户声明的析构函数的Move构造函数?

使用Eclipse UML插件Papyrus生成C ++构造函数和析构函数

C ++多线程:构造函数和析构函数是否需要互斥体?

根据C ++标准,显式调用构造函数和析构函数是否安全?

C ++ Protobuf对构造函数/析构函数的未定义引用

C++ 共享对象初始化构造函数析构函数

使用 C++ Dll 的 LNK2019 构造函数/析构函数

C++ 你能在构造函数或析构函数中引用 this 指针吗?

在C ++中从构造函数中显式地调用析构函数是不好的做法吗?

C ++错误:“ <'”标记之前的预期构造函数,析构函数或类型转换

C ++错误:“(”标记之前出现了预期的构造函数,析构函数或类型转换

C ++,静态对象构造函数中的异常会绕过先前静态对象的析构函数

这个C ++析构函数是多余的吗?

C ++分配和析构函数

非虚拟析构函数c ++的异常

C ++中的析构函数直接调用

C ++析构函数删除共享内存