copy constructor的构造操作

一、调用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时;

猜你喜欢

转载自blog.csdn.net/qq_32164245/article/details/80865780
今日推荐