最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++無痛實現(xiàn)日期類的示例代碼

 更新時間:2022年10月18日 10:59:12   作者:梨+蘋  
凡是要寫類必須要提到六大默認成員(六位大爺):構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值重載函數(shù)、取地址重載函數(shù)(包括const對象和普通對象);那么這次的日期類又需要伺候哪幾位大爺呢?本文就來詳細說說

日期類的實現(xiàn)

凡是要寫類必須要提到六大默認成員(六位大爺):構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值重載函數(shù)、取地址重載函數(shù)(包括const對象和普通對象);那么這次的日期類又需要伺候哪幾位大爺呢?

日期類的實現(xiàn)中函數(shù)與函數(shù)之間有較強的耦合性,所以實現(xiàn)的邏輯順序一定要把握好,不然會暈頭轉(zhuǎn)向的!!! 下面是我的實現(xiàn)順序:

構(gòu)造函數(shù)

Date(const Date& d)//拷貝構(gòu)造函數(shù)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
        
    }

析構(gòu)函數(shù)

~Date()//析構(gòu)函數(shù)
    {
        _year = 1;
        _month = 1;
        _day = 1;
    }

拷貝構(gòu)造函數(shù)

    Date(const Date& d)//拷貝構(gòu)造函數(shù)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
        
    }

打印函數(shù)

    void Print()//打印函數(shù)
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }

這里我們還需要寫一個獲取月份對應(yīng)天數(shù)的函數(shù)

獲取天數(shù)函數(shù)

    int GetTrueDay(int year, int month)//得到正確月份天數(shù)
    {
        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];
        }
    }

這里就是大體框架了,接下來是各個細節(jié)部分

運算符重載區(qū)

判斷兩個日期是否相等(*this==d)

bool operator==(const Date& d) const;//等于
//---相等為真(返回1);不相同為假(返回0)
bool Date:: operator==(const Date& d) const//等于
{//年相等才判斷到月,月相等才判斷到年
    return _year == d._year
        && _month == d._month
        && _day == d._day;
}

判斷前一個日期是否大于后一個日期(*this>d)

bool operator>(const Date& d) const;//大于
//---相等為真(返回1);不相同為假(返回0)
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;
    }
//大于
}

判斷前一個日期是否大于等于后一個日期(*this>=d)

這里直接重載?。?!

bool operator>=(const Date& d) const//大于等于
    {
        return *this > d || *this == d;
    }

判斷前一個日期是否小于后一個日期(*this<d)

這里直接重載!?。?/p>

    bool operator<(const Date& d)const //判斷小于
    {
        return !(*this >= d);
    }

判斷前一個日期是否小于等于后一個日期(*this<=d)

這里直接重載?。。?/p>

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

賦值重載

前一個日期等于后一個日期(*this=d)—可以連續(xù)賦值

    Date& operator=(const Date& d)//賦值重載
        {
            if (this!=&d)
            {
                _year = d._year;
                _month = d._month;
                _day = d._day;
            }
            else
            {
                return*this;
            }
        }

對日期減天數(shù)-不影響自身-用拷貝構(gòu)造

    Date operator-(int day) const;//減天數(shù)
Date Date:: operator-(int day) const//減天數(shù)-不影響本身-不用引用-用拷貝構(gòu)造函數(shù)
{
    Date tmp(*this);
    tmp-= day;
    return tmp;
}

對日期加天數(shù)-不影響自身-用拷貝構(gòu)造

Date operator+(int day) const;//加天數(shù)
Date Date:: operator+(int day) const//加天數(shù)-不影響本身-不用引用-用拷貝構(gòu)造函數(shù)
{
    Date tmp(*this);
    tmp+= day;
    return tmp;
}

日期減等天數(shù)-影響自身-用引用

Date& operator-=(int day) ;//減等天數(shù)
Date& Date:: operator-=(int day) //減等天數(shù)- 影響本身-用引用-不加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;
    
}

日期加等天數(shù)-影響自身-用引用

Date& operator+=(int day);//加天數(shù)
Date& Date:: operator+=(int day) //加天數(shù)- 影響本身-用引用-不加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;
}

日期天數(shù)前置++【影響自身(自增)-用引用-不加const】

Date& operator++(); //天數(shù)前置++
Date& Date::operator++()//前置++-改變自身-用引用
{
    return *this += 1;
}

日期天數(shù)后置++【不影響自身-用拷貝構(gòu)造】

Date operator++(int);//后置++
Date Date::operator++(int)//后置++-不改變自身-用拷貝函數(shù)-括號里+int
{
    Date tmp(*this);
    *this += 1;
    return tmp;
}

日期天數(shù)前置–【影響自身(自減)-用引用-不加const】

Date& operator--();//前置--
Date& Date::operator--()//前置-- --需要改變自身-用引用
{
    return *this -= 1;
}

日期天數(shù)后置–【不影響自身-用拷貝構(gòu)造

Date operator--(int);//后置--
Date Date::operator--(int)//后置--,不需要改變自身-用構(gòu)造函數(shù)-括號里+int
{
    Date tmp(*this);
    *this -= 1;
    return tmp;
 }

日期減日期(前一個日期減后一個日期-算差距天數(shù))

int operator-(const Date& d)const;//日期減日期-算差距天數(shù)
int Date:: operator-(const Date& d) const//日期減日期-算差距天數(shù)-都不改變自身+const
{
	Date max = *this;
	Date min=d;
	int flag = 1;
	if (*this<d)
	{
		max = d;
		min = *this;
		flag = -1;//如果*this比d小則減出來是負數(shù),所以要預(yù)備flag=-1
	}

	int n = 0;
	while (min < max)//min++,max--,最后相等時,n++得出的就是差距天數(shù)
	{
		n++;
		min++;
	}
	return flag * n;//*this比d小,得出來是負數(shù)-乘-1,*this比d大,得正數(shù)-乘1
}

流插入函數(shù)

friend ostream& operator<<(ostream& out, Date& d);//流插入友元聲明
ostream& operator<<(ostream& out, Date& d)//流插入
{
    cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
    return cout;
}

流提取函數(shù)

    friend istream& operator>>(istream& in, Date& d);//流提取友元聲明
istream& operator>>(istream& in, Date& d)//流提取
{
    in>> d._year;
    in >> d._month;
    in >> d._day;
    return in;
    
 }

好啦,以上就是日期類實現(xiàn)各個模塊啦,下面是整體代碼!

整體代碼

Date.h

#pragma once
#include<iostream>
using namespace std;
class Date
{
public:

	Date(const Date& d)//拷貝構(gòu)造函數(shù)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
		
	}

	~Date()//析構(gòu)函數(shù)
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	void Print()//打印函數(shù)
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

	int GetTrueDay(int year, int month)//得到正確月份天數(shù)
	{
		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)//構(gòu)造函數(shù)
		: _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;//減天數(shù)
		Date operator+(int day) const;//加天數(shù)
		Date& operator-=(int day) ;//減等天數(shù)
		Date& operator+=(int day);//加天數(shù)
		Date& operator++(); //天數(shù)前置++
		Date operator++(int);//后置++
		Date& operator--();//前置--
		Date operator--(int);//后置--
		int operator-(const Date& d)const;//日期減日期-算差距天數(shù)
		friend ostream& operator<<(ostream& out, Date& d);//流插入友元聲明
		friend istream& operator>>(istream& in, Date& d);//流提取友元聲明
private:
	int _year;
	int _month;
	int _day;
}; 

Date.cpp

#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//減天數(shù)-不影響本身-不用引用-用拷貝函數(shù)
{
	Date tmp(*this);
	tmp-= day;
	return tmp;
}
Date Date:: operator+(int day) const//加天數(shù)-不影響本身-不用引用-用拷貝函數(shù)
{
	Date tmp(*this);
	tmp+= day;
	return tmp;
}

Date& Date:: operator-=(int day) //減等天數(shù)- 影響本身-用引用-不加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) //加天數(shù)- 影響本身-用引用-不加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)//后置++-不改變自身-用拷貝函數(shù)-括號里+int
{
	Date tmp(*this);
	*this += 1;
	return tmp;
}
Date& Date::operator--()//前置-- --需要改變自身-用引用
{
	return *this -= 1;
}
Date Date::operator--(int)//后置--,不需要改變自身-用構(gòu)造函數(shù)-括號里+int
{
	Date tmp(*this);
	*this -= 1;
	return tmp;
 }

int Date:: operator-(const Date& d) const//日期減日期-算差距天數(shù)-都不改變自身+const
{
	Date max = *this;
	Date min=d;
	int flag = 1;
	if (*this<d)
	{
		max = d;
		min = *this;
		flag = -1;//如果*this比d小則減出來是負數(shù),所以要預(yù)備flag=-1
	}

	int n = 0;
	while (min < max)
	{
		n++;
		min++;
	}
	return flag * n;//*this比d小,得出來是負數(shù)-乘-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;
	
 }

以上就是C++無痛實現(xiàn)日期類的示例代碼的詳細內(nèi)容,更多關(guān)于C++日期類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++實現(xiàn)單例模式日志輸出詳解

    C++實現(xiàn)單例模式日志輸出詳解

    這篇文章主要為大家詳細介紹了C++中單例模式的相關(guān)知識,并給出單例模式日志實現(xiàn),文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-04-04
  • C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼

    C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼

    這篇文章主要介紹了 C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲

    VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲

    本文主要介紹了VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲,實現(xiàn)了視頻,拍照,保存這三個功能。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 深入解析C++編程中的純虛函數(shù)和抽象類

    深入解析C++編程中的純虛函數(shù)和抽象類

    這篇文章主要介紹了深入解析C++編程中的純虛函數(shù)和抽象類,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++ EasyX學(xué)習(xí)之鼠標操作詳解

    C++ EasyX學(xué)習(xí)之鼠標操作詳解

    EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將為大家詳細講講EasyX的鼠標操作,需要的可以參考一下
    2022-07-07
  • C語言實現(xiàn)簡易貪吃蛇游戲的示例代碼

    C語言實現(xiàn)簡易貪吃蛇游戲的示例代碼

    這篇文章主要介紹了如何利用C語言實現(xiàn)一個經(jīng)典的小游戲——貪吃蛇,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2022-10-10
  • C++實現(xiàn)完整功能的通訊錄管理系統(tǒng)詳解

    C++實現(xiàn)完整功能的通訊錄管理系統(tǒng)詳解

    來了來了,通訊錄管理系統(tǒng)踏著七彩祥云飛來了,結(jié)合前面的結(jié)構(gòu)體知識和分文件編寫方法,我總結(jié)并碼了一個帶菜單的通訊錄管理系統(tǒng),在這篇文章中將會提到C的清空屏幕函數(shù),嵌套結(jié)構(gòu)體具體實現(xiàn),簡單且充實,跟著我的思路,可以很清晰的解決這個項目
    2022-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿

    C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 詳解C++ new-handler機制

    詳解C++ new-handler機制

    這篇文章主要介紹了C++ new-handler機制的相關(guān)資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-11-11
  • C++深入刨析muduo中的抽象類Poller

    C++深入刨析muduo中的抽象類Poller

    muduo網(wǎng)絡(luò)庫中Poller類是一個抽象類,用戶使用PollPoller或者EPollPoller類,下面跟隨小編一起來詳細了解一下
    2022-04-04

最新評論

兴安县| 略阳县| 罗源县| 高淳县| 凌源市| 曲阜市| 龙江县| 柞水县| 罗源县| 六枝特区| 怀集县| 克山县| 呼图壁县| 安阳市| 金昌市| 镇安县| 巴里| 平武县| 抚顺市| 龙泉市| 巴彦淖尔市| 肇源县| 万安县| 金湖县| 确山县| 通城县| 瑞金市| 永清县| 育儿| 恭城| 冕宁县| 都昌县| 阳泉市| 通江县| 招远市| 乐都县| 肥城市| 田阳县| 德惠市| 独山县| 翼城县|