C++显式,默认拷贝构造函数的特征以及使用


前言

C++规定:
1.内置类型传参直接拷贝。
2.自定义类型传参要进行拷贝构造完成拷贝

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

一、拷贝构造函数特征

拷贝构造函数也是特殊的成员函数,其特征如下:

  1. 拷贝构造函数是构造函数的一个重载形式。
  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

我们接下来看看为什么用传值调用不报错的话就会形成无限递归:
在这里插入图片描述
要解决这个问题我们必须要传引用
在这里插入图片描述

二、默认拷贝构造函数(编译器生成)

若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝
在这里插入图片描述

编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?
我们先来看一个反例:
在这里插入图片描述
这里编译器直接报错了:
在这里插入图片描述
我们来分析一下问题:
因为默认拷贝函数实行的是浅拷贝,所以s1与s2里面的地址指向的都是同一块空间。
然后程序结束的时候我们同一块空间会被释放两次。
在这里插入图片描述

默认拷贝函数(编译器自己生成的作用):
1.内置类型成员完成值拷贝/浅拷贝
2.自定义类型成员会去调用他的拷贝构造函数
3. 当我们遇到地址的拷贝的时候一定要去自己写拷贝函数实现深拷贝
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_74774759/article/details/130718538