copy构造函数被用来"以同型对象初始化自我对象", copyassignment 操作符被用来"从另一个同型对象中拷贝其值到自我对象" :
class Widget {
public:
Widget(); //default构造函数
Widget(const Widget& rhs); //copy构造函数
Widget& operator=(const Widget& rhs); //copy assignment 操作符
Widget wl; II调用default 构造函数
Widget w2 (wl) ; II调用copy 构造函数
wl = w2; II调用copy assignment 操作符
当你看到赋值符号时请小心,因为"="语法也可用来调用copy 构造函数:
Widget w3 = w2; II调用copy 构造函数!
幸运的是" copy 构造"很容易和"copy 赋值"有所区别:
如果一个新对象被定义(例如以上语句中的w3,一定会有个构造函数被调用,不可能调用赋值操作。
如果没有新对象被定义(例如前述的"w1 = w2" 语句) ,就不会有构造函数被调用,那么当然就是赋值操作被调用。
注:
所谓default构造函数是一个可被调用而不带任何实参者。这样的构造函数要不没有参数,要不就是每个参数都有缺省值。
class A (
public:
A(); //default构造函数
class B (
public:
explicit B(int x = 0, bool b = true); //defauft构造函数;
};
class C {
public:
explicit C (工nt x); //不是default构造函数
};
记住:
1、当你编写一个copying函数,请确保(1) 复制所有local 成员变量, (2) 调用所有base classes 内的适当的copying 函数。
2、不要尝试以某个copying 函数实现另一个copying 函数。应该将共同机能放进第三个函数中,并由两个coping 函数共同调用。