一、调用copy constructor
三种情况下,会以一个object的内容作为另一个class object的初值,即调用copy constructor。
1、显式定义
class X{...};
X x;
//显式地以一个object的内容作为另一个class object的初值
X xx = x;
2、当object被当做函数参数时
extern void foo(X x);
void bar()
{
X xx;
//以xx作为foo()第一个参数的初值(隐式的初始化操作)
foo(xx);
...
}
3、当函数传回一个class object时
X foo_bar()
{
X xx;
//...
return xx;
}
二、default memberwise initialization(对每一个成员施以初始化)
如果一个class没有提供一个explicit copy constructor的时候,当class object以相同class的另一个object作为初值,内部是以所谓的default memberwise initialization完成,就是把每一个内建或者派生的data member的值,从某个object拷贝一份到另一个object身上,不过它并不会拷贝其中的member class object,而是以递归的形式施行memberwise initialization。
class String{
public:
//...没有explicit copy constructor
private:
char *str;
int len;
};
String object的default memberwise initialization发生在如下情况:
String noun("book");
String verb = noun;
//语意相等
verb.str = noun.str;
verb.len = noun.len;
如果一个String object被声明为另一个class的member,
class Word
{
public:
//...没有explicit copy constructor
private:
int _occurs;
String _words;//String obje成为class Word的一个member
};
这个Word object的default memberwise initialization会拷贝其内建的member _occurs,然后再于String member object _word身上递归实施memberwise initialization。
三、编译器需要合成出copy constructor的四种情况
1、当class内含一个member object而后者的class声明有一个copy constructor时;
2、当class继承自一个base class而后者存在一个copy constructor时;
3、当class声明了一个或多个virtual functions时;
4、当class派生自一个继承串链,其中有一个或多个virtual base class时;