我正在处理RVO(返回值优化)/拷贝构造函数/析构函数相关的代码,并进行随机检查。这里我有点困惑,为什么析构函数会被调用三次..??
#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
被调用两次。
一次是针对 (=) 运算符的
对象。
第二次是针对 int main()
函数的对象。
为什么它会被第三次调用?以及如何发生的?
A operator =(A obj){
这个操作符会拿一个临时的拷贝,所以这个拷贝的析构函数也会被调用。这里应该改成A& operator =(const A& obj){}
,同时还需要补充上return *this;
。 - πάντα ῥεῖ