您的位置:首页 > 运维架构

Memberwise copy(深拷贝)与Bitwise copy(浅拷贝)的区别

2014-05-25 16:44 218 查看
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都执向相同的内存,删除任一个内存都会析放另一个对象的内存。

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

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

本文来自:http://blog.csdn.net/sghcpt/article/details/5578320

相关阅读文献:

http://blog.csdn.net/arcsinsin/article/details/9815937
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: