目录
一、概念
在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?C++用拷贝构造解决这个问题。
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
二、特性
1、拷贝构造是一个重载形式
拷贝构造函数是构造函数的一个重载形式。所以拷贝构造名跟类名相同,只是参数不同。
❓那为什么一定要加const呢?
【解答】是为了减少错误。const修饰的被拷贝的对象,被拷贝的对象是不能修改的。
2、拷贝构造必须传引用传参
拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。
1)为什么必须传引用传参呢?
内置类型,编译器可以直接拷贝
自定义类型的拷贝,需要调用拷贝构造函数
2)为什么传值传参会引发无穷调用呢?
对于自定义类型,采用传值形式的话,那么调用函数就需要传参,传的是形参,是实参的一份拷贝,就必须调用一次拷贝构造函数形成形参。
调用函数就要先传参,传参就会形成一个新的拷贝构造........
3、默认拷贝构造函数
若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
默认生成的拷贝函数:
1.内置类型完成值拷贝/浅拷贝----按byte一个一个拷贝。
2.自定义类型会调用相对应的拷贝构造/赋值重载。
1)涉及资源申请
如果自定义类型涉及到资源申请调用默认拷贝构造,程序会崩溃。
2)必须调用拷贝构造
自定义类型涉及到资源申请,必须调用拷贝构造函数
三、拷贝构造函数典型调用场景
🟢使用已存在对象创建新对象
🟢函数参数类型为类类型对象
🟢函数返回值类型为类类型对象
注意:为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用 尽量使用引用。引用可以避免开辟空间。