經歷前期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 運算子被多次過...