C++ 按值传递类

标签 c++ constructor destructor

当我在 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

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

最佳答案

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

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

将其添加到类定义中:

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() 函数时,原始内容将被销毁。

关于C++ 按值传递类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229680/

相关文章:

c++ - 制作一个以坐标为键的 std::map

c++ - 在 C++ 中调用析构函数不会手动销毁对象

c++ - n 个字节的低 7 位串联

C++:清除对象 vector 的问题

java - 通用内部类构造函数接受不同类型的参数设置什么?

java - 子类的不同构造函数

c++ - 当用于 "new"初始化时, () 和 {} 是否总是等价的?

c++ - Qt4 中的析构函数

c++ - 析构函数的使用 = 删除;

c++ - 浮点异常的原因?