复制构造函数,按值传递和 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 值被复制到 p2
和 p1
。
我用两个不同的编译器编写了这个程序,得到了两个不同的结果:
#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 值被复制到 p2
和 p1
。