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

C++深拷贝与浅拷贝的区别

2016-04-10 20:57 232 查看
转自:http://blog.csdn.net/sghcpt/article/details/5578320

又加了一些自己补充。

原文:

Memberwise copy: 在初始化一个对象期间,基类的构造函数被调用,成员变量被调用,如果它们有构造函数的时候,它们的构造函数被调用,这个过程是一个递归的过程.

Bitwise copy: 原内存拷贝.例子,给定一个对象object,它的类型是class Base.对象object占用10字节的内存,地址从0x0到0x9.如果还有一个对象objectTwo,类型也是class Base.那么执行objectTwo = object;如果使用Bitwise拷贝语义,那么将会拷贝从0x0到0x9的数据到objectTwo的内存地址,.也就是说Bitwise是字节到字节的拷贝.

对于默认的拷贝构造函数不会使用深拷贝,它只是使用浅拷贝.这意味着类的所有的成员是一层深度的拷贝而已。如果你的类或结构体成员中只是包含基本的数据类型例如int, float, char,那么Memberwise copy与Bitwise copy基本是相同的。但如果类中有指针存在,那么你可能会遇到问题。

例如下面的例子:

class A

{

   int m1;

   double d1;

   char* pString;

};

如果你创建两个这样的类对象,class A  a, b;并且你给a赋值,

a.mi = 6;

a.d1 = 10.123;

a.pString = new char[10];

astrcpy(a.pString, "test");//这里是浅拷贝

如果执行b = a;那么会把对象a的每一个成员的值赋值给b的每个成员。

b.m1 = a.m1;

b.d1 = a.d1;

b.pString = a.pString;//现在对象a和b的成员pString都执向相同的内存,删除任一个内存都会析放另一个对象的内存。

所以你需要深拷贝,它不是拷贝的内存地址而是拷贝内存地址的内容。一个默认的拷贝构造函数经常执行浅拷贝,只有拥有

自己的拷贝函数才可以实现深拷贝。

补充:

在BitWise Copy Sematics中,因为是按位拷贝的(内存复制),所以那些整数、数组等都会拷贝,新得到的类和原来的类完全一样。但是需要注意一点,如果有指针时,例如

Class Test{

……;

char * p;

};

Test B=A;//A是Test类的对象

这时候如果是BitWise Copy,那么A和B中的指针p就会指向同一内存,如果内存在构造函数中释放,那么另一个类的指针将失效。

在一下4中情况,不要BitWise Copy

1、当Class内的成员变量是一个类,这各类声明了Copy Constructor(不是编译器默认合成)时。

2、当Class继承自一个Base Class时,而Base Class存在Copy Constructor时(不是编译器默认合成)。

3、当Class中声明有virtual function时

4、当Class继承自一个继承串链,其中一个或多个virtual Base Class时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: