当我在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
为什么析构函数触发两次而构造函数仅触发一次?
最佳答案
从指针值可以看到,对象被销毁了一次。您还将看到另一个对象的破坏。该对象是原始对象的副本。
通过按值传递对象,将调用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()
函数时,原始文件将被销毁。关于c++ - C++按值传递类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25229680/