我用两种不同的编译器编写了该程序,并得到了两种不同的结果:
#include <iostream>
using namespace std;
class Point {
public:
int n;
Point() { n = 0; }
Point operator= (Point p) { return *this; }
Point(const Point& p) { cout<<"copy\n"; }
~Point() { cout<<"Destruct\n"; }
};
int main() {
Point p1, p2, p3;
p1 = p2 = p3;
return 0;
}
编译器1:
copy
copy
copy
Destruct
Destruct
Destruct
Destruct
Destruct
Destruct
编译器2:
copy
copy
Destruct
copy
Destruct
Destruct
Destruct
Destruct
Destruct
我知道有些编译器通过不调用复制构造函数来根据函数中对象的值优化通过/返回。这是两个结果不同的原因吗?
更重要的是,为什么复制构造函数对代码的p2 = p3部分调用两次,而对p1 = ...只调用一次?
我没有使用C ++进行很多OO编程,这就是为什么我对这个简单的问题感到困惑。我真的很感谢一些提示
答案 0 :(得分:1)
您的赋值运算符应返回Point &
而不是Point
,并且它也应将参数作为参考:
Point &operator = (const Point &p) { return *this; }
否则,可能会发生不必要的复制。很有可能创建了一个副本并分配给赋值运算符,然后将返回值同时复制到p2
和p1
。