第二章:类——日期类的实现

本文详细介绍了C++中日期类的设计,包括私有成员的使用、各种成员函数(如构造函数、析构函数、拷贝构造函数及各种运算符重载)的实现,旨在帮助读者掌握类的封装和运算符重载的技巧。
摘要由CSDN通过智能技术生成

目录

一、私有成员:

二、成员函数:

2.1构造函数:

2.2析构函数:

2.3拷贝构造函数:

2.4获取某年某月的天数:

三、运算符重载:

3.1赋值运算符重载:

3.2 +=的重载:

3.3 +的重载:

3.4 -=的重载:

3.5 -的重载:

3.6 <的重载:

3.7==的重载:

3.8<=的重载:

3.9 >和>=的重载:

3.10 !=的重载:

3.11前置++和后置++的重载:

3.12 前置--和后置--:

3.13 日期减去日期返回之间相隔的天数:

3.14、<<和>>的重载:


一、私有成员:

  • 日期类,我们只希望调用者使用成员函数而不去修改成员变量。因此,我们将成员变量设置在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成员变量了。
  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

S+叮当猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值