copy 构造函数被用来“以同型对象初始化自我对象”。 copy assignment(当然冲在了=) 被用来“从另一个同型对象中拷贝其值到自我对象”。
例如下例:
class Wiget {
public:
Widget(); // default constructor
Widget(const Widget& rhs);
Widget& operator=(const Widget& rhs);
...
};
Widget w1; // 调用default constructor
Widget w2(w1); // 调用copy constructor
w1 = w2; // 调用copy assigment operator, 因为w1, w2 构建出出来了
但是, 当你看到赋值符号的时候, 必须小心。 因为“=”语法也可以用来调用从copy constructor:
Widget w3 = w2; // 调用赋值构造函数, 因为w3 是一个新定义的对象。
幸运的是, “copy 构造” 很容易和“copy 赋值”区分开来。 如果一个新对象被定义式, 一定会有一个构造函数被调用(如w3), 不可能调用赋值操作, 如果没有新对象定义, (例如前面的w1 = w2), 就不会有构造函数被调用。 当然就是赋值操作。
NOTE: 关于构造函数, 也可以按照如下调用:
Widget w4 = Widget();
Copy 构造函数非常重要, 因为当该类对象需要pass by value作为参数传递给函数(形参 )的时候, 这个将实参复制给形参就需要通过copy 构造函数完成。 例如:
bool hasAccepted(Widget w);
............
Widget aWidget;
if(hasAccepted(aWidget))....
参数w 是以pass by value 的方式传递给函数hasAccepted, 所以上述调用中, aWidget被复制到w体内, 这个复制动作需要有Widget 的复制构造函数完成。 “pass by value” 意味着调用复制构造函数。 以by value 的方式传递用户自定义类型通常是一个坏主意, pass-by-reference -to-const往往是一个很好地选择。