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时;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值