【拷贝构造函数】
概念:拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时编译器自动调用。
特征:拷贝构造函数也是特殊的成员函数,其特征如下:
1.拷贝构造函数是构造函数的一个重载形式(因为都是用来初始化类的)。
2.拷贝构造函数的参数只能有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
3.若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储的字节序完成拷贝,这种拷贝叫浅拷贝,或者叫值拷贝。
tips:有的人说,这不是蛮好的?我就不用手动实现这个拷贝构造,反正都是按照字节序来拷贝的,反正原本的里面有啥,拷贝就能得到啥?但是你想过没有?如果类里面使用malloc或者其他的申请出内存空间的,这个时候开辟的空间可以一起拷贝出来吗?答案是否定的,只能拷贝出那个申请出的头指针,且使用析构函数析构的时候,会出现二次析构的情况。
注意:类中如果没有涉及倒资源申请时,拷贝构造函数是否写都可以,一旦涉及到资源申请时,则拷贝构造函数一定是要写的,否则就是浅拷贝
5.拷贝构造函数典型调用场景
a)使用已存在对象创建新对象
b)函数参数类型为类类型对象
c)函数返回值为类类型对象
【赋值运算符重载】
C++为了增强代码的可读性引入了运算符的重载,运算符重载是具有特殊函数名的函数,也具有其返回值的类型,函数名字以及参数列表,其返回值与参数列表与普通的函数类似。
函数名为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
注意:
1.不能通过链接其他符号来创建新的操作符:比如operator@
2.重载操作符必须要有一个类类型参数
3.用于内置类型的运算符,其含义不能改变,例如:内置内省的+,不能将其含义改编为-
4.作为类成员函数重载时,其形参看起来比操作数数目少一,因为成员函数第一个参数为隐藏的this
5. .* :: sizeof ?: . 注意以上五个运算符不能重载,这个经常在笔试选择题中出现。
6.赋值运算符只能重载成类的成员函数不能重载成全局函数
7.原因:赋值运算符如果不显示实现,编译器会生成一个默认的,此时用户在类外自己实现一个全局的赋值运算符重载,就和编译器中生成的默认运算符重载冲突了,所以赋值运算符重载只能是类的成员函数。
8.用户没有显示实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置成员变量是直接赋值的,而自定义类型成员变量是需要调用对应的赋值运算符重载完成赋值的。
9.既然编译器生成的默认赋值运算符重载函数已经完成字节序的值拷贝了,还需要自己手动实现吗?
这个答案是肯定的,如果编译器能将一切代码写好,那还要我们程序员干啥?
若类中没有资源管理的情况下,那么的确是可以不手动实现这个赋值运算符,但是如果含有资源管理,那么我们就要去实现这个赋值运算符了。
以上就是本期的全部内容了,如果觉得陈述的还行的话还请一键三连,毕竟码字不易。