当我在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
为什么析构函数只触发两次而构造函数只触发一次?
答案 0 :(得分:5)
从指针值可以看出,对象被销毁一次。您还会看到另一个对象的破坏。此对象是原始的副本。
通过按值传递对象,将调用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()
函数时,原始文件将被销毁。
答案 1 :(得分:0)
您看到两个析构函数的原因是因为您按值传递参数。按值传递会调用复制构造函数..
第一个析构函数:
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
答案 2 :(得分:0)
这里对象构造了两次(如上所述)。因此调用2个构造函数+ 2析构函数。您看到1个构造函数的原因是您没有定义复制构造函数。当为值传值操作进行复制时,将调用CC。
添加复制构造函数,然后您可以看到名为。
的构造函数添加复制构造函数 - MyClass(const MyClass&amp; obj){std :: cout&lt;&lt; “MyClass Copy Cons”&lt;&lt;这个&lt;&lt;的std :: ENDL;}