您的位置:首页 > 编程语言 > C语言/C++

深度搜索C++对象模型2.2 构造函数语义学-Copy Constructor的构造操作

2014-07-19 16:27 260 查看
首先理解下深拷贝和浅拷贝

深拷贝与浅拷贝

Shallow Copy = Bitwise Copy(按位拷贝语义),Deep Copy = Memberwise Copy(成员逐一复制).

1. Default Memberwise Initialization是与user defined Initialization相对应的。是从编译器(计算机)与程序员(用户)的角度出发;
2. bitwise copy 是与memberwise copy相对应的。是两种不同的拷贝方式,编译器通常为了效率会选择bitwise方式拷贝(尤其针对于POD(=Plain Old Data)类型)。
那么为什么这两个概念经常会混淆呢?主要原因是二者有部分交集——在类的对象初始化或者赋值(operator=)时,两个概念会同时出现。
从对象整体角度出发,默认的对象赋值操作和初始化操作(default assignment and initialization ),编译器会选择memberwise方式(这里不是指memberwise copy,更确切的说应该是:individually assignment or initialization)操作,即对构成对象中的每一个成员数据分别进行赋值或者初始化。从对象的数据成员角度出发,具体到对象的每一个数据成员的操作,编译器通常采用(可以认为就是)bitwise copy操作,就像memcpy或者memset函数一样,原样将内存中的数据按位复制一份。

当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:

(1)一个对象以值传递的方式传入函数体

(2)一个对象以值传递的方式从函数返回

(3)一个对象需要通过另外一个对象进行初始化。
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。
自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。
编译器默认合成浅拷贝函数,理解了深拷贝和浅拷贝,我们应该明白当类里面有指针什么的时候就需要自己显示合成拷贝构造函数。

那么什么 情况下bitwise copy semantics会失效呢?

四种情况

(1)当class内含一个class member object ,而后者的class声明有一个copy constructor 时----被class设计者明确声明或被编译器合 成-------递归调用;

(2)当class继承自一个base class,而后者存在一个copy constructor时-----被class设计者明确声明或被编译器合成-------递归调用;

(3)当class声明了一个或多个virtual functions时-------因为此时要考虑类对象中的虚函数表指针vptr的值。

(4) 当class 派生自一个继承串链,其中有一个或者多个virtual base class 是。

(上面主要是网上搜集的一些片段)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: