C++中的位拷贝和值拷贝

为了便于说明我们以String类为例:

首先定义String类,而并不实现其成员函数。

Class String{
public:
    String(
const char *ch=NULL);//默认构造函数
    String(const String &str);//拷贝构造函数
   ~String(void);
   String 
&operator=(const String &str);//赋值函数
private:
   
char *m_data;
};

位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象AB。A.m_data和B.m_data分别指向一段区域,A.m_data="windows",B.m_data=“linux";

如果未重写赋值函数,将B赋给A;编译器会默认进行位拷贝,A.m_data=B.m_data

则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:

(1):A.m_data原来指向的内存区域未释放,造成内存泄露。

(2):A.m_dataB.m_data指向同一块区域,任何一方改变都会影响另一方

 (3):当对象被析构时,B.m_data被释放两次。

对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。

如果重写赋值函数和拷贝构造函数后,

A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变

 
C++中,浅拷贝拷贝是处理对象复制时的两种不同方式,它们的主要区别如下: - **复制内容**:浅拷贝是将一个对象的指针赋到另一个对象中,只复制对象的成员变量的,而不复制对象动态分配的内存(如堆内存)等外部资源;深拷贝则不仅复制对象中的,还复制指向动态分配内存的指针所指向的内存,使得每个对象都有自己独立的内存空间 [^1][^2]。 - **资源所有权**:浅拷贝时,原始对象拷贝对象共享相同的内存资源;深拷贝中,每个对象拥有独占的资源,对象间不会相互干扰 [^3][^4]。 - **内存开销**:浅拷贝的内存开销较小,因为仅复制指针;深拷贝的内存开销大,需要复制所有数据 [^4]。 - **安全性**:浅拷贝可能导致多个对象同时释放同一块内存,从而引发内存错误或程序崩溃等问题,安全性较低,需要额外管理共享资源;深拷贝实现了资源隔离,安全性较高 [^3][^4]。 - **实现复杂度**:浅拷贝无需额外实现,是C++的默认行为;深拷贝需要手动实现拷贝构造函数运算符 [^4]。 以下是一个简单的代码示例,展示浅拷贝拷贝的区别: ```cpp #include <iostream> #include <cstring> // 浅拷贝示例 class ShallowCopyExample { public: int* data; ShallowCopyExample(int value) { data = new int(value); } // 默认拷贝构造函数,进行浅拷贝 ShallowCopyExample(const ShallowCopyExample& other) { data = other.data; } ~ShallowCopyExample() { delete data; } }; // 深拷贝示例 class DeepCopyExample { public: int* data; DeepCopyExample(int value) { data = new int(value); } // 自定义拷贝构造函数,进行深拷贝 DeepCopyExample(const DeepCopyExample& other) { data = new int(*(other.data)); } ~DeepCopyExample() { delete data; } }; int main() { // 浅拷贝测试 ShallowCopyExample obj1(5); ShallowCopyExample obj2 = obj1; // 这里可能会出现问题,因为obj1obj2的data指向同一块内存,析构时会重复释放 // 深拷贝测试 DeepCopyExample obj3(10); DeepCopyExample obj4 = obj3; // obj3obj4有各自独立的内存,不会有重复释放的问题 return 0; } ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值