【问题标题】:C++ Passing class by valueC++ 按值传递类
【发布时间】:2014-10-03 11:29:36
【问题描述】:

当我在 XCode 版本 5.1.1 中运行以下程序时,

#include <iostream>
class MyClass
{
public:
    MyClass() { std::cout << "MyClass Cons " << this << std::endl;}
    ~MyClass() { std::cout << "MyClass Dest " << this << std::endl;}

};
void Func(MyClass myClass)
{

}
int main(int argc, const char * argv[])
{
    MyClass myClass1;
    Func(myClass1);
    return 0;
}

我得到的输出是

MyClass Cons 0x7fff5fbff918
MyClass Dest 0x7fff5fbff910
MyClass Dest 0x7fff5fbff918

为什么析构函数触发两次而构造函数只触发一次?

【问题讨论】:

  • 您正在制作副本。您还需要提供一个详细的复制构造函数。
  • 感谢您的快速回复

标签: c++ constructor destructor


【解决方案1】:

对象被销毁一次,从指针值可以看出。您还会看到另一个对象的破坏。此对象是原始对象的副本。

通过按值传递对象,copy-constructor 被调用。由于此构造函数不打印任何内容,因此您在输出中看不到它。

将其添加到类定义中:

MyClass(const MyClass & other) { std::cout << "MyClass Copy-Cons " << this << " from " << &other << std::endl;}

它应该会出现:

MyClass Cons 0x7fff1beee7ee
MyClass Copy-Cons 0x7fff1beee7ef from 0x7fff1beee7ee
MyClass Dest 0x7fff1beee7ef
MyClass Dest 0x7fff1beee7ee

当您输入 Func() 时会创建副本。副本在超出范围时被销毁。当您退出 Func() 时会发生这种情况。最后,退出main()函数时,原始文件被销毁。

【讨论】:

  • 感谢您的快速回复
【解决方案2】:

您看到两个析构函数的原因是因为您按值传递参数。按值传递调用复制构造函数..

第一个析构函数:

At the end of the func function, the object goes out of scope, hence, it is destructed.

第二个析构函数:

When the program end, the object is destructed.

我建议删除第一个析构函数是通过引用而不是值传递对象。

例如,

void Func(MyClass &myClass)
{

}

所以现在输出将只有:

MyClass Cons 0x7fff5fbff918
MyClass Dest 0x7fff5fbff918

【讨论】:

    【解决方案3】:

    这里的对象被构​​造了两次(就像上面每个人都提到的那样)。因此调用了 2 个构造函数 + 2 个析构函数。您看到 1 个构造函数的原因是您尚未定义复制构造函数。在为按值传递操作制作副本时调用 CC。

    添加复制构造函数,然后你就可以看到两个构造函数都被调用了。

    添加复制构造函数 - MyClass(const MyClass& obj) { std::cout

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 2012-07-29
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多