【类和对象】——拷贝构造函数和赋值运算符重载函数

本文详细介绍了类的拷贝构造函数和赋值运算符重载,讨论了深拷贝、浅拷贝和写时拷贝的概念,以及它们在防止资源重复释放和内存管理中的重要性。通过示例解释了如何实现深拷贝的拷贝构造函数和赋值运算符重载,强调了const引用在防止对象被修改和避免递归调用中的作用。
摘要由CSDN通过智能技术生成

1、类中6个默认成员函数

下图列出了类中6个默认的成员函数,在我之前的博文中仔细的讲解了构造函数和析构函数,具体参照构造函数和析构函数
在这里插入图片描述

2、拷贝构造函数

1.1深拷贝、浅拷贝、写时拷贝

1、浅拷贝
这种拷贝的话编译器只是将指针的值拷贝过来,结果多个对象共用同一块内存。如下图所示:
在这里插入图片描述
这样存在的问题就是当一个对象将这块内存释放掉过后,另一些对象不知道该块内存已经还给了系统,以为还有效,所以在对这段内存进行操作的时候,容易发生违规访问

2、深拷贝
深拷贝是指的构造s2的时候拷贝一块儿和跟s1指向数据块一样大的数据块,并将值拷贝下来,这样s1和s2指向各自的数据块,析构时释放各自的数据块,如下图所示:
在这里插入图片描述
这种方式就解决了前面浅拷贝存在的问题。但是系统默认提供的是浅拷贝的方式,因此,如果要实现深拷贝需要自己实现。
【举个栗子】string类实现深拷贝

String(const String& s)
{
	_str = new char[strlen(s.str)+1];
	strcpy(_str,s._str);
}

3、写实拷贝
写时拷贝简单来说就是当你读取一片空间时,系统并不会为你开辟一个一模一样的空间给你,只有在当你真正修改的时候,才会开辟一片空间给你
具体参照我们的另外一篇博文浅拷贝、深拷贝、写时拷贝

1.2拷贝构造函数详解

1、定义
拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象生成相同类型的新对象时由编译器自动调用。

2、具体实现
在上面我们探讨了浅拷贝和深拷贝。那么在实现这个拷贝构造函数的时候究竟是用何种方式呢?

  • 首先,深拷贝和浅拷贝都是由拷贝构造函数所引发的,若不自定义拷贝构造函数,那么编译器会调用默认的拷贝构造函数,属于浅拷贝
  • 当类成员中存在指针类型的数据成员时,浅拷贝仅仅是拷贝了原对象的副本给新对象,会导致两个指针指向同一个内存空间,不会新开辟内存进行数据拷贝,因此在析构函数执行时,会出现错误,会导致资源的两次释放
  • 如果是深拷贝,首先是按照原对象的大小进行新空间的分配,然后在新空间进行对原数据的拷贝,仅仅复制数据到新内存。如下图所示:
    在这里插入图片描述

所以,我们对商品类采用深拷贝的方式来实现
【补充——商品类】

class CGoods
{
   
public
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值