目录
一、拷贝构造函数
1、什么是拷贝构造函数?
顾名思义,就是一个可以复制对象数据的函数,而且还是构造函数的一种。
2、拷贝构造函数的调用
(1)调用方式
/* 把 d1 的数据拷到 d2 里 */
Date d2(d1);
(2)调用哪个拷贝构造函数?
2.1 关于浅拷贝与深拷贝
浅拷贝(值拷贝):
即无脑拷贝这个类里面所有成员的值(包括地址值)。
深拷贝:
当对象的构造函数在堆上开空间时,如果是浅拷贝,那么这个堆上的空间就会被两个指针指着,那么当你要调用析构函数时,这个空间就会被释放两次,那么就会导致程序崩溃。因此深拷贝就是要连空间也要重开一个,且空间里面的内容要完全一样。
2.2调用哪个拷贝构造函数?
当没有显式定义拷贝构造函数时,程序就会自己生成一个拷贝构造函数,但要注意的是,这个拷贝函数只进行值拷贝(浅拷贝)。因此,当我们要拷贝的内容都是栈上的内容时,就不用自己写拷贝构造了。但是如果有的内容在堆上的话,那么我们就要自己写拷贝构造了。
3、显式拷贝构造函数的格式
Date(Date& d)
{
//...
}
(1)为什么一定要引用传参?
如果不是引用传参,那么函数就是传值函数。那它是怎么传值的呢?不也就通过拷贝构造函数实现的嘛,可是程序还没进入拷贝构造函数呢!因此就会形成无限递归。所以,我们可以用传引用,那样就不用额外开空间了,那么自然也没有拷贝构造函数啥事了。
二、操作符重载函数
1、什么是操作符重载?
操作符重载,其实就是指给一些操作符赋予特殊含义,让我们可以把自定义类型当作内置类型来操作。如 ++ 正常情况下只能让内置类型的变量 +1 ,但通过操作符重载后,++ 就可以使 Date(我们定义的自定义类型) +1 了。
2、操作符重载的条件
(1)我们一般只选取操作变量的结果是否有意义来断定要不要写操作符重载函数。就像 Date + Date 的结果使没有意义的,因此我们就不会写 Date + Date 的操作符重载函数;但 Date + 天数就有意义(因为其得数是日期),因此我们就可以写 Date + day 的操作符重载函数。
(2)也不是所有操作符都可以给你重载,如 “ . * ” 、“ :: ”、“ ? : ”、“ sizeof ”、“ . ” ,它们都不能 重载。
3、操作符重载函数书写格式
/* 函数的定义 */
bool operator<(Date d) /* 形参表里依然有隐含的 this 指针 */
{
//...
}
/* 函数调用 */
d1 < d2;
//二者等价
d1.operator<(d2);
4、赋值操作符重载
为什么要把它单拎出来呢?因为如果没有显式定义赋值操作符重载函数,程序会自己生成一个默认赋值重载函数。它的行为和默认拷贝构造一样,就是对内置类型进行值拷贝,对自定义类型就调用该类型的赋值重载函数。但也只有赋值操作重载有这般待遇,其他操作符重载函数是没有的。