目录
一、私有成员:
- 日期类,我们只希望调用者使用成员函数而不去修改成员变量。因此,我们将成员变量设置在private中限制访问,将成员函数设置在public中允许访问。
- 成员变量有三个,年月日,分别在变量名前面加上下划线和非成员变量做区分。
二、成员函数:
将所有函数的实现都放在一个文件中,命名为fun.cpp文件;将所有函数的声明和类的框架放在一个文件中,命名为fun.h;将调用逻辑放在一个文件中,命名为test.cpp。
2.1构造函数:
①声明:
- 上图为全缺省构造函数的声明。
- 对于声明定义分离的情况,只在函数声明时赋值,不在函数定义时重复赋值,否则报错。
②定义:
- 赋值之后检查赋值是否符合规范,不合规范提醒即可。
2.2析构函数:
由于日期类成员变量不含有自定义类型成员,所以日期类的析构函数可以不用显式定义,由编译器自动生成的默认析构函数就够用了。
2.3拷贝构造函数:
日期类没有自定义成员,所以编译器默认生成的就够用。
2.4获取某年某月的天数:
- 直接定义一个数组存储12个月的天数,数组前加上static延长数组的生命周期,使得不用每次使用都要创建数组,每次用完都要销毁数组。
- 判断当前年份是否为闰年,如果是闰年且是二月,返回29天而非初始定义的28天。
三、运算符重载:
3.1赋值运算符重载:
- 由于要支持连续赋值,如d1=d2=d3,这种类型。就需要设置返回值类型为类的类型。而且由于返回值在返回后依旧存在,所以考虑使用引用返回节省资源。
- 像d1=d1这种赋值,编译器并不会报错,如果要禁止,就需要加上if判断两个对象的地址是否相同,如果不相同才进行赋值。
3.2 +=的重载:
- 先实现+=再复用+=实现+的实现,可以节省两次拷贝构造的资源。
- 如果出现要加一个负天数的情况,我们直接调用-=运算符重载这个负天数返回即可。
- 要注意先减去当月天数再对月份加一,反之则会减去下个月的天数导致出错。
3.3 +的重载:
复用+=,思路是:创建一个临时对象,对临时对象操作,返回临时对象的值。
3.4 -=的重载:
大致和+=相同,先修改年和月的值,再对天数做修改,顺序不能乱,自己体会。
3.5 -的重载:
复用-=,原理和+=相同,都是创建一个临时对象,返回临时对象的值。
3.6 <的重载:
首先判断年是否小于,小于则返回;其次判断年相等月不相等的情况,月小于则返回;最后判断年和月都相等的情况,日小于则返回。如果都不返回,则说明不小于,返回false。
3.7==的重载:
年月日都相等返回1,否则返回值为0。
3.8<=的重载:
复用<和=。
3.9 >和>=的重载:
3.10 !=的重载:
3.11前置++和后置++的重载:
前置++和后置++的运算符相同,为了区别两个运算符达到重载的目的,需要再使用函数重载区分。规定后置++的参数栏要写一个int来占位。
①前置++
②后置++
后置++返回的是加之前的值,所以要拷贝构造一个临时对象,返回临时对象。由于临时对象出了函数被销毁,所以不使用引用返回。
3.12 前置--和后置--:
原理同前置++和后置++。
3.13 日期减去日期返回之间相隔的天数:
- 由于对两个日期对象的操作不希望映射到对象本身,所以拷贝构造两个临时对象max和min来完成操作。
- 先找出较大的日期,再找出较小的日期。循环操作较小的日期,使得两个日期在不相等之前,一直对较小的日期加1。等两个日期相等之后,累计的天数就是相差的天数。
- 设立一个flag,最后返回时乘以累积的天数,就可以知道是d1比d2小还是d1比d2大。
3.14、<<和>>的重载:
- <<的一个操作数类型为ostream,>>的一个操作符为istream类型。
- 由于操作符重载,操作符两边的操作数的顺序不能颠倒,而作为成员函数时,默认第一个参数必定为*this,所以不能将<<和>>的重载写为成员函数。要在外面声明。
- 但是写在外面无法调用private成员变量,就需要在函数体加上友元声明,友元声明可以在对象中任意位置。这样友元函数就可以调用private成员变量了。