复制构造函数,按值传递和 return 按值传递,链式操作,编译器

copy constructor, pass by value and return by value, chain operation, compiler

我用两个不同的编译器编写了这个程序,得到了两个不同的结果:

#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

我知道一些编译器通过不调用复制构造函数来优化 pass/return 通过函数对象的值。这就是两个结果不同的原因吗?

更重要的是,为什么复制构造函数在代码的 p2 = p3 部分被调用两次,而 p1 = ... 只被调用一次?

我使用 C++ 进行的 OO 编程不多,这就是为什么我对这个简单的问题感到困惑。我非常感谢一些提示

你的赋值运算符应该 return Point & 而不是 Point,并且它也应该将参数作为参考:

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

否则,可能会出现不必要的复制。最有可能的是,创建一个副本进入赋值运算符,然后 returned 值被复制到 p2p1