【发布时间】:2015-09-05 18:24:02
【问题描述】:
我正在研究 RVO/Copy-Constructor/Destructor 并随机检查代码。我在这里有点困惑为什么析构函数调用了三次......?
#include <iostream>
using namespace std;
class A{
public:
A(){
cout << "Simple Constructor" << endl;
}
A(const A& obj){
cout << "Copy Constructor " << endl;
}
A operator =(A obj){
cout << "Assignment Operator" << endl;
}
~A(){
cout << "Destructor " << endl;
}
};
A fun(A &obj){
cout << "Fun" << endl;
return obj;
}
int main(){
A obj;
obj=fun(obj);
cout << "End" << endl;
return 0;
}
输出:
Simple Constructor // ok
Fun // ok
Copy Constructor // ok for =
Assignment Operator // ok
Destructor // ok for =
Destructor // why here destructor called?
End // ok
Destructor // ok for main
我期待Destructor 被调用两次。
一个用于(=) operator's 对象。
int main()'s 对象的第二个。
为什么叫第三次?以及如何?
【问题讨论】:
-
A operator =(A obj){获取一个临时副本,它的析构函数也被调用。签名应为A& operator =(const & A obj){。你也错过了return *this; -
因为输入不会改变。
-
@Drop 我在软件工程的第二学期,我们的老师没有深入地教我们。我只是在思考,工作,无法与任何人讨论。 :) 这就是我在这里的原因.. :) 并且书籍并没有提供所有要清除的内容。 :) 无论如何谢谢。
-
1) 不是VS2015编译的。 2)修复错误后再次检查它,并彻底计算真实输出中的构造函数和您发布的构造函数
标签: c++