我用两种不同的编译器编写了该程序,结果有两种不同:

#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编程,这就是为什么我对这个简单的问题感到困惑。我真的很感谢一些提示

最佳答案

您的赋值运算符应返回Point &而不是Point,并且它也应将该参数作为引用:

Point &operator = (const Point &p) { return *this; }

否则,可能会发生不必要的复制。最有可能的是,创建一个副本进入赋值运算符,然后将返回的值复制到p2p1

10-01 23:36