C 實現日期類(運算子過載)

2021-10-19 08:04:20 字數 4750 閱讀 7435

經歷前期c語言的學習,c語言的程式設計思路是面向過程的程式設計,將所需要實現的功能封裝為每乙個功能函式,在主函式中進行呼叫

c++程式設計思想是物件導向的程式設計,相比較於c語言的程式設計,它更具有更高的安全性和可維護性,c++的特性將功能利用類進行抽象後進行封裝,之後在通過建立物件實現功能呼叫

基於基礎c++11標準下新特性,主要通過運算子過載來實現日期類

首先來了解運算子過載的特性:

運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。

函式名字為:關鍵字operator後面接需要過載的運算子符號。

函式原型:返回值型別 operator操作符(引數列表)

注意:

1,不能通過連線其他符號來建立新的操作符:比如operator@

2,過載操作符必須有乙個類型別或者列舉型別的運算元

3,用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不能改變其含義

4,作為類成員的過載函式時,有乙個預設的形參this,限定為第乙個形參

5,.* 、:: 、sizeof  、?:   、.  注意以上5個運算子不能過載

7編譯器會預設生成賦值運算子過載,完成值拷貝

類成員變數

類建構函式

類析構函式

類拷貝建構函式

+=運算子過載

-=運算子過載

+/-運算子過載

前置++/--運算子過載

後置++/--運算子過載

關係運算子過載(日期比較)

日期間隔天數計算

日期類中主要以年  月   日   作為成員變數,同時為了實現c++類的封裝,將其設定為私有成員變數

private:

int _y;

int _m;

int _d;

為了初始化類物件的建立,編譯器預設的建構函式為無參建構函式,這裡自定義帶預設引數的建構函式初始化類物件

date(int y = 1900, int m = 1, int d = 1)

傳入引數為乙個int整型的天數

首先判斷傳入天數是否為乙個負數   +=乙個負數等於-=乙個正數

以類成員變數天數_d加天數判斷是否溢位

根據溢位天數進行月份進製  以及年份進製和月份歸1

進製過程需要通過乙個while迴圈判斷,判斷條件為天數《當前月份天數結束迴圈

int getday(int y, int m)

; int day = days[m];

if (m == 2 && (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)))

return day;

} date& operator+=(int day)//日期+=運算

_d += day;

//判斷天數是否溢位

while (_d > getday(_y, _m))

}return *this;//左運算元即為this指標指向

}

傳入引數為乙個int整型的天數

首先判斷傳入天數是否為乙個負數   -=乙個負數等於+=乙個正數

以類成員變數天數_d減去天數判斷是否需要前乙個月的天數來進行補償

根據所需補償天數進行月份退位  以及年份退位和月份歸12

由於需要前乙個月天數來補償,所以先考慮退位,再進行補償天數計算

進製過程需要通過乙個while迴圈判斷,判斷條件為天數》0結束迴圈

date& operator-=(int day)//日期-=運算

_d -= day;

//判斷天數是否為負數

while (_d < 0)

_d += getday(_y, _m);//計算補償天數

} return *this;//左運算元即為this指標指向

}

日期的加減操作,其需要注意,左運算元不為返回值,所需左運算元不會被修改,需要建立新物件作為返回值 進行值傳遞

date operator+(int day)//日期+運算   d=d1+90;  d1本身不會被修改  而是值傳遞

date operator-(int day)//日期-運算 d=d1-90; d1本身不會被修改 而是值傳遞

自加運算子自身改變,所以返回型別為引用,且引數為預設this指標,返回this指標解引用+1或-1

//前置++

date& operator++()//本身改變 可以返回引用

//前置--

date& operator--()//本身改變 可以返回引用

後置自加操作,自身先不改變,等傳值結束後,再進行加1操作

this指向左運算元 左運算元先賦值後才會改變  需要建立臨時物件作為返回值

//後置++  與前置++構成過載  引數加入int

date operator++(int)

//後置-- 與前置--構成過載 引數加入int

date operator--(int)

關係判斷包括  ==   !=    >    =    <=

其中形參包括隱含this和顯示建立的常引用型別d

返回值為bool型別  作為關係判斷條件

bool operator==(const date& d)

bool operator!=(const date& d)

bool operator>(const date&d)

else if (_y == d._y)

}} return false;

} bool operator

bool operator>=(const date& d)

bool operator<=(const date& d)

綜合之前所寫的運算子過載函式包括++  +=  -=  --等,再次基礎上完成

相隔天數計算:小日期經過多少次自加與大日期相同

//日期相減  相差天數

int operator-(const date& d)

int day = 0;

while (min < max)

return flag * day;

}

#includeusing namespace std;

class date

} return *this;//左運算元即為this指標指向

} date& operator-=(int day)//日期-=運算

_d -= day;

//判斷天數是否為負數

while (_d < 0)

_d += getday(_y, _m);//計算補償天數

} return *this;//左運算元即為this指標指向

} date operator+(int day)//日期+運算 d=d1+90; d1本身不會被修改 而是值傳遞

date operator-(int day)//日期-運算 d=d1-90; d1本身不會被修改 而是值傳遞

//前置++

date& operator++()//本身改變 可以返回引用

//前置--

date& operator--()//本身改變 可以返回引用

//後置++ 與前置++構成過載 引數加入int

date operator++(int)

//後置-- 與前置--構成過載 引數加入int

date operator--(int)

bool operator==(const date& d)

bool operator!=(const date& d)

bool operator>(const date&d)

else if (_y == d._y)

}} return false;

} bool operator

bool operator>=(const date& d)

bool operator<=(const date& d)

//日期相減 相差天數

日期類之運算子過載

date.h pragma once include include using namespace std class date date const date d 拷貝構造 date bool isinvalid void show date operator const date d 賦值運算...

c 日期類的實現級運算子的過載

今天寫了簡單的日期類,有興趣的可以看一下 其宣告date.h define crt secure no warnings 1 ifndef oncedate define oncedate includeusing namespace std class date endif定義如下 include...

運算子過載 類 C

運算子過載 就是對已有的運算子 c 中預定義的運算子 賦予多重的含義,是同乙個運算子作用與不同型別的資料是導致不同型別的行為 實質 函式過載 1 可以過載為普通函式也可以過載為成員函式 2 把含運算子的表示式轉換成對運算子函式的呼叫 3 把運算子的運算元轉換 成 運算子函式的引數 4 運算子被多次過...