目录
拷贝构造函数
特性

因为函数传参得过程中要发生一次值拷贝,在语句 Date d2(d1); 执行时,d1要把值传递给d,在这个过程中又去调用了拷贝构造,从而造成了无穷递归调用。正确的写法如下:
引用传参,就很好的就解决了这一问题。
编译器默认生成的拷贝构造

为什么说编译器自动生成的拷贝构造是浅拷贝呢?如下代码就给出了解释:
以上 代码中,使用了编译器默认生成的拷贝构造,此时会出现如下图情况:
s1中的arr和s2中的arr的值一样,指向了同一块申请出来的空间,而像Stack这种类必须要在析构函数中进行释放空间,那么当s1和s2分别析构时,同一块空间被释放了两次,这是不允许的。所以说,默认生成的拷贝构造是一种浅拷贝,也叫值拷贝。
那么默认生成的拷贝构造会对自定义类型做什么呢?请看如下代码:A类中拷贝构造函数被执行了,可以得出这样的结论:默认生成的拷贝构造函数,对于基本类型进行浅拷贝,对于自定义类型,会去调用自定义类型对象的拷贝构造。
赋值运算符重载
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
特性

在传参过程中,尽量以引用传参,这样就能避免传值传参时调用拷贝构造了。接下来进行连续赋值:
以上代码编译报错了,因为语句:d3=d2=d1;执行是从右往左的,那么在执行完d2=d1后,返回值为void,此时相当于把void赋值给d3,显然这是错的。想解决这一问题,就要更改返回值类型,代码如下:
*this就是对this指针解引用,拿到的是d2对象,直接将其返回。
此时d2=d1, 执行完成后,拿到了返回值,就可以用d2对d3赋值了。
编译器默认生成的赋值重载
以下代码中并没有给出赋值重载,但是依旧可以使用,这时使用的就是编译器默认生成的了:
对于自定义类型,默认生成的赋值重载会怎么做呢?来看如下代码:
A类中的赋值重载被执行了,总结一下:默认生成的赋值重载,对于基本类型进行浅拷贝,对于自定义类型,会去调用自定义类型对象的赋值重载。
const成员

以上对"=="运算符进行了重载,比较两个类对象中的值是否相等,但是这样的比较有缺陷。万一把"=="写成了"=",那么编译不报错,但是执行代码就发生了错误。所以并不希望去改变两个要进行比较的对象的值,所以代码中可以加上const,如下:
在以上代码中,括号中的const保证d2对象不能直接改变,而括号外的const,保证*this不改变,也就是d1对象不能直接改变。
取地址及const取地址操作符重载

不经常使用,了解一下就可以了。