• c++无痛实现日期类


    image-20221017213635229

    日期类的实现

    凡是要写类必须要提到六大默认成员(六位大爷):构造函数、析构函数、拷贝构造函数、赋值重载函数、取地址重载函数(包括const对象和普通对象);那么这次的日期类又需要伺候哪几位大爷呢?

    日期类的实现中函数与函数之间有较强的耦合性,所以实现的逻辑顺序一定要把握好,不然会晕头转向的!!! 下面是我的实现顺序:

    构造函数

    Date(const Date& d)//拷贝构造函数
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    		
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    析构函数

    ~Date()//析构函数
    	{
    		_year = 1;
    		_month = 1;
    		_day = 1;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    拷贝构造函数

    	Date(const Date& d)//拷贝构造函数
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    		
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    打印函数

    	void Print()//打印函数
    	{
    		cout << _year << "-" << _month << "-" << _day << endl;
    	}
    
    • 1
    • 2
    • 3
    • 4

    这里我们还需要写一个获取月份对应天数的函数

    获取天数函数

    	int GetTrueDay(int year, int month)//得到正确月份天数
    	{
    		static int monthday[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
    		if (month == 2 && ((year % 4 == 0 && year % 100 != 0)
            || (year % 400 == 0)))
    		{
    			return 29;
    		}
    		else
    		{
    			return monthday[month];
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这里就是大体框架了,接下来是各个细节部分

    运算符重载区

    判断两个日期是否相等(*this==d)
    bool operator==(const Date& d) const;//等于
    //---相等为真(返回1);不相同为假(返回0)
    
    • 1
    • 2
    bool Date:: operator==(const Date& d) const//等于
    {//年相等才判断到月,月相等才判断到年
    	return _year == d._year
    		&& _month == d._month
    		&& _day == d._day;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    判断前一个日期是否大于后一个日期(*this>d)
    bool operator>(const Date& d) const;//大于
    //---相等为真(返回1);不相同为假(返回0)
    
    • 1
    • 2
    bool Date:: operator>(const Date& d) const//大于
    {//这里一样的判断顺序依次是年---月---日
    	if (_year > d._year)
    	{
    		return true;
    	}
    	else if (_month > d._month)
    	{
    		return true;
    	}
    	else if (_day > d._day)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    //大于
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    判断前一个日期是否大于等于后一个日期(*this>=d)

    这里直接重载!!!

    bool operator>=(const Date& d) const//大于等于
    	{
    		return *this > d || *this == d;
    	}
    
    • 1
    • 2
    • 3
    • 4
    判断前一个日期是否小于后一个日期(*this

    这里直接重载!!!

    	bool operator<(const Date& d)const //判断小于
    	{
    		return !(*this >= d);
    	}
    
    • 1
    • 2
    • 3
    • 4
    判断前一个日期是否小于等于后一个日期(*this<=d)

    这里直接重载!!!

    	bool operator<=(const Date& d)const//小于等于
    		{
    			return !(*this > d);
    		}
    
    • 1
    • 2
    • 3
    • 4

    赋值重载

    前一个日期等于后一个日期(*this=d)—可以连续赋值
    	Date& operator=(const Date& d)//赋值重载
    		{
    			if (this!=&d)
    			{
    				_year = d._year;
    				_month = d._month;
    				_day = d._day;
    			}
    			else
    			{
    				return*this;
    			}
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    对日期减天数-不影响自身-用拷贝构造
    	Date operator-(int day) const;//减天数
    
    • 1
    Date Date:: operator-(int day) const//减天数-不影响本身-不用引用-用拷贝构造函数
    {
    	Date tmp(*this);
    	tmp-= day;
    	return tmp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    对日期加天数-不影响自身-用拷贝构造
    Date operator+(int day) const;//加天数
    
    • 1
    Date Date:: operator+(int day) const//加天数-不影响本身-不用引用-用拷贝构造函数
    {
    	Date tmp(*this);
    	tmp+= day;
    	return tmp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    日期减等天数-影响自身-用引用
    Date& operator-=(int day) ;//减等天数
    
    • 1
    Date& Date:: operator-=(int day) //减等天数- 影响本身-用引用-不加const
    {
    	if (day < 0)
    	{
    		return *this += abs(day);
    	}
    	_day -= day;
    	while (_day<=0)
    	{
    		--_month;
    		if (_month == 0)
    		{
    			--_year;
    			_month = 12;
    		}
    		_day += GetTrueDay(_year, _month);
    	}
    	return *this;
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    日期加等天数-影响自身-用引用
    Date& operator+=(int day);//加天数
    
    • 1
    Date& Date:: operator+=(int day) //加天数- 影响本身-用引用-不加const
    {
    	if (day < 0)
    	{
    		return *this -= abs(day);
    	}
    	_day += day;
    	while (_day > GetTrueDay(_year, _month))
    	{
    		_day -= GetTrueDay(_year,_month);
    		_month++;
    		if (_month == 13)
    		{
    			_year++;
    			_month = 1;
    		}
    	}
    	return *this;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    日期天数前置++【影响自身(自增)-用引用-不加const】
    Date& operator++(); //天数前置++
    
    • 1
    Date& Date::operator++()//前置++-改变自身-用引用
    {
    	return *this += 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    日期天数后置++【不影响自身-用拷贝构造】
    Date operator++(int);//后置++
    
    • 1
    Date Date::operator++(int)//后置++-不改变自身-用拷贝函数-括号里+int
    {
    	Date tmp(*this);
    	*this += 1;
    	return tmp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    日期天数前置–【影响自身(自减)-用引用-不加const】
    Date& operator--();//前置--
    
    • 1
    Date& Date::operator--()//前置-- --需要改变自身-用引用
    {
    	return *this -= 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    日期天数后置–【不影响自身-用拷贝构造】
    Date operator--(int);//后置--
    
    • 1
    Date Date::operator--(int)//后置--,不需要改变自身-用构造函数-括号里+int
    {
    	Date tmp(*this);
    	*this -= 1;
    	return tmp;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    日期减日期(前一个日期减后一个日期-算差距天数)
    int operator-(const Date& d)const;//日期减日期-算差距天数
    
    • 1
    int Date:: operator-(const Date& d) const//日期减日期-算差距天数-都不改变自身+const
    {
    	Date max = *this;
    	Date min=d;
    	int flag = 1;
    	if (*this<d)
    	{
    		max = d;
    		min = *this;
    		flag = -1;//如果*this比d小则减出来是负数,所以要预备flag=-1
    	}
    
    	int n = 0;
    	while (min < max)//min++,max--,最后相等时,n++得出的就是差距天数
    	{
    		n++;
    		min++;
    	}
    	return flag * n;//*this比d小,得出来是负数-乘-1,*this比d大,得正数-乘1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    流插入函数
    friend ostream& operator<<(ostream& out, Date& d);//流插入友元声明
    
    • 1
    ostream& operator<<(ostream& out, Date& d)//流插入
    {
    	cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
    	return cout;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    流提取函数
    	friend istream& operator>>(istream& in, Date& d);//流提取友元声明
    
    • 1
    istream& operator>>(istream& in, Date& d)//流提取
    {
    	in>> d._year;
    	in >> d._month;
    	in >> d._day;
    	return in;
    	
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    好啦,以上就是日期类实现各个模块啦,下面是整体代码!

    
     Date.h
    
    • 1
    • 2
    #pragma once
    #include
    using namespace std;
    class Date
    {
    public:
    
    	Date(const Date& d)//拷贝构造函数
    	{
    		_year = d._year;
    		_month = d._month;
    		_day = d._day;
    		
    	}
    
    	~Date()//析构函数
    	{
    		_year = 1;
    		_month = 1;
    		_day = 1;
    	}
    
    	void Print()//打印函数
    	{
    		cout << _year << "-" << _month << "-" << _day << endl;
    	}
    
    	int GetTrueDay(int year, int month)//得到正确月份天数
    	{
    		static int monthday[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
    		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
    		{
    			return 29;
    		}
    		else
    		{
    			return monthday[month];
    		}
    	}
    	Date(int year = 1, int month = 1, int day = 1)//构造函数
    		: _year(year)
    		, _month(month)
    		, _day(day)
    	{
    
    	}
    
    	bool operator==(const Date& d) const;//等于
    	bool operator>(const Date& d) const;//大于
    	bool operator>=(const Date& d) const//大于等于
    	{
    		return *this > d || *this == d;
    	}
    		bool operator<(const Date& d)const //判断小于
    	{
    		return !(*this >= d);
    	}
    		bool operator<=(const Date& d)const//小于等于
    		{
    			return !(*this > d);
    		}
    
    		Date& operator=(const Date& d)//赋值重载
    		{
    			if (this!=&d)
    			{
    				_year = d._year;
    				_month = d._month;
    				_day = d._day;
    			}
    			else
    			{
    				return*this;
    			}
    		}
    		Date operator-(int day) const;//减天数
    		Date operator+(int day) const;//加天数
    		Date& operator-=(int day) ;//减等天数
    		Date& operator+=(int day);//加天数
    		Date& operator++(); //天数前置++
    		Date operator++(int);//后置++
    		Date& operator--();//前置--
    		Date operator--(int);//后置--
    		int operator-(const Date& d)const;//日期减日期-算差距天数
    		friend ostream& operator<<(ostream& out, Date& d);//流插入友元声明
    		friend istream& operator>>(istream& in, Date& d);//流提取友元声明
    private:
    	int _year;
    	int _month;
    	int _day;
    }; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    Date.cpp
    
    • 1
    
    #include"Date.h"
    
    
    
    
    bool Date:: operator==(const Date& d) const//等于
    {
    	return _year == d._year
    		&& _month == d._month
    		&& _day == d._day;
    }
    
    bool Date:: operator>(const Date& d) const//大于
    {
    	if (_year > d._year)
    	{
    		return true;
    	}
    	else if (_month > d._month)
    	{
    		return true;
    	}
    	else if (_day == d._day)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    
    }
    
    Date Date:: operator-(int day) const//减天数-不影响本身-不用引用-用拷贝函数
    {
    	Date tmp(*this);
    	tmp-= day;
    	return tmp;
    }
    Date Date:: operator+(int day) const//加天数-不影响本身-不用引用-用拷贝函数
    {
    	Date tmp(*this);
    	tmp+= day;
    	return tmp;
    }
    
    Date& Date:: operator-=(int day) //减等天数- 影响本身-用引用-不加const
    {
    	if (day < 0)
    	{
    		return *this += abs(day);
    	}
    	_day -= day;
    	while (_day<=0)
    	{
    		--_month;
    		if (_month == 0)
    		{
    			--_year;
    			_month = 12;
    		}
    		_day += GetTrueDay(_year, _month);
    	}
    	return *this;
    	
    }
    
    Date& Date:: operator+=(int day) //加天数- 影响本身-用引用-不加const
    {
    	if (day < 0)
    	{
    		return *this -= abs(day);
    	}
    	_day += day;
    	while (_day > GetTrueDay(_year, _month))
    	{
    		_day -= GetTrueDay(_year,_month);
    		_month++;
    		if (_month == 13)
    		{
    			_year++;
    			_month = 1;
    		}
    	}
    	return *this;
    }
    
    Date& Date::operator++()//前置++-改变自身-用引用
    {
    	return *this += 1;
    }
    
    Date Date::operator++(int)//后置++-不改变自身-用拷贝函数-括号里+int
    {
    	Date tmp(*this);
    	*this += 1;
    	return tmp;
    }
    Date& Date::operator--()//前置-- --需要改变自身-用引用
    {
    	return *this -= 1;
    }
    Date Date::operator--(int)//后置--,不需要改变自身-用构造函数-括号里+int
    {
    	Date tmp(*this);
    	*this -= 1;
    	return tmp;
     }
    
    int Date:: operator-(const Date& d) const//日期减日期-算差距天数-都不改变自身+const
    {
    	Date max = *this;
    	Date min=d;
    	int flag = 1;
    	if (*this<d)
    	{
    		max = d;
    		min = *this;
    		flag = -1;//如果*this比d小则减出来是负数,所以要预备flag=-1
    	}
    
    	int n = 0;
    	while (min < max)
    	{
    		n++;
    		min++;
    	}
    	return flag * n;//*this比d小,得出来是负数-乘-1,比大,乘1
    }
    
    ostream& operator<<(ostream& out, Date& d)//流插入
    {
    	cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
    	return cout;
    }
    
    istream& operator>>(istream& in, Date& d)//流提取
    {
    	in>> d._year;
    	in >> d._month;
    	in >> d._day;
    	return in;
    	
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145

    你也赶紧动手试试把 ~~ 如果感觉文章不错的话动动小手点个赞鼓励下博主吧~~~后续我会继续更新优质文章哒

  • 相关阅读:
    2022 CLion 中的Cygwin 配置(最全,最良心版)
    Java:ArrayList的基本使用(学习笔记)
    cmake笔记
    docker 安装 jenkins
    gRPC调试, 用 Apipost
    测试用例的设计方法(全):边界值分析方法
    MySQL 基础笔记(2)
    加解密算法
    【软件测试】别人家的才是最优秀的,一位“屌丝”的逆袭......
    如何快速生成一个H5滑动的卡片(单页和分页都有)
  • 原文地址:https://blog.csdn.net/m0_71841506/article/details/127377668