主要实现了Date类的一些运算符重载
全部代码:
头文件 Date.h 类定义 成员函数声明
#include<assert.h>
#include<iostream>
using namespace std;
class Date
{
public:
//使用构造函数初始值列表来初始化 默认1900年1月1日
Date(int y=1900, int m=1, int d=1);
//拷贝构造函数 必须引用
Date(const Date & d);
void Display();
//析构函数
~Date();
//成员函数实现运算符重载
/*bool operator==(const Date& d)
{
return this->_year == d._year&&this->_month == d._month&&this->_day == d._day;
}*/
//友元函数实现运算符重载
//friend bool operator==(const Date &d1, const Date &d2);
bool operator==(const Date &d);
// "="运算符重载 不能用友元
Date& operator=(const Date &d);
//运算符重载
//+ - -= += 前置/后置++ 前置/后置--
Date operator+(int day);
Date& operator+=(int day);
Date operator-(int day);
Date& operator-=(int day);
Date operator++(); //前置++
Date operator++(int); //后置++
Date operator--(); //前置--
Date operator--(int); //后置--
//静态函数
static bool Date::IsLeapYear(int year);
private:
int GetMonDay(int year, int month);
int _year; //年
int _month;//月
int _day; //日
};
源文件 Date.cpp 成员函数实现 主要是一些运算符重载的练习
#include"Date.h"
Date::Date(const Date & d) :_year(d._year), _month(d._month), _day(d._day)
{
assert(_year > 1900);
assert(_month >0&&_month<13);
assert(_day>0 && _day <= GetMonDay(_year,_month));
}
Date::Date(int y, int m, int d) :_year(y), _month(m), _day(d){}
void Date::Display()
{
cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
Date::~Date()
{
//cout << "析构函数!" << endl;
}
bool Date::operator==(const Date &d)
{
return (this->_year == d._year) && (this->_month == d._month) && (this->_day == d._day);
}
Date &Date::operator=(const Date & d) //这样写可以保证 d1=d2=d3这样的表达式成立
{
this->_year = d._year;
this->_month = d._month;
this->_day = d._day;
return *this;
}
Date Date::operator+(int day)
{
Date tmp=*this;
int countDay=day;
//判断增加天数不超过本月
assert(countDay>= 0);
if (tmp._day + countDay <= GetMonDay(tmp._year, tmp._month))
{
tmp._day += countDay;
return tmp;
}
else //超过了本月 要考虑未超出一年 超出一年
{
while (countDay--)
{
if (tmp._day != GetMonDay(tmp._year,tmp._month))
++tmp._day;
else
{
++tmp._month;
tmp._day = 1; //置为1
if (tmp._month > 12)
{
++tmp._year;
tmp._month %= 12;
}
if (tmp._year > 4000) //超过4000年就不能再计数了
{
tmp._year = 1900;
tmp._month = 1;
tmp._day = 1;
}
}
}
}
return tmp;
}
Date& Date::operator+=(int day)
{
*this = *this + day; //调用 operator+ 函数
return *this;
}
Date Date::operator-(int day)
{
Date tmp = *this;
int countDay = day;
assert(day >= 0);
while (countDay--)
{
if (tmp._day != 1)
{
--tmp._day;
}
else
{
if (tmp._month != 1) //不是1月
{
--tmp._month; //减少一月
tmp._day=GetMonDay(tmp._year, tmp._month);
}
else //是一月
{
--tmp._year; //减少一年
if (tmp._year < 1900) //如果到了1900年以前 终止 返回1900年1月1日
{
tmp._year = 1900;
tmp._month = 1;
tmp._day = 1;
return tmp;
}
tmp._month = 12; //变为12月
tmp._day = GetMonDay(tmp._year, tmp._month);
}
}
}
return tmp;
}
Date& Date::operator-=(int day)
{
*this = *this - day; //调用 operator- 函数
return *this;
}
Date Date::operator++() //前置++
{
return *this+=1;
}
Date Date::operator++(int) //后置++
{
Date tmp = *this;
*this += 1;
return tmp;
}
Date Date::operator--() //前置--
{
return *this -= 1;
}
Date Date::operator--(int) //后置--
{
Date tmp = *this;
*this -= 1;
return tmp;
}
//获取某一个月的天数
int Date::GetMonDay(int year, int month)
{
int MonDayNum[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
bool flag=IsLeapYear(year);
if (month == 2 && flag)
return MonDayNum[2]+1; //闰年且是2月
else
return MonDayNum[month];
}
//
友元函数的运算符重载
//bool operator==(const Date &d1, const Date &d2)
//{
// return (d1._year == d2._year) && (d1._month == d2._month) && (d1._day == d2._day);
//}
//静态函数
bool Date::IsLeapYear(int year)
{
return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}
源文件 Main.cpp 测试用例 测试所有函数
//测试
#include"Date.h"
void Test1()
{
Date d1(2015);
Date d2 = d1;
Date d3; //默认构造
d3.Display();
d3 = d2;
d3.Display();
//d2.Display();
}
void Test2()
{
Date d1(2015);
Date d2;
d1.Display();
d2.Display();
d2 = d1;
d2.Display();
}
void Test3() //测试 + -
{
Date d1(2015);
Date d2 = d1 + 31;
Date d3 = d1 - 31;
//d3 = d1 - 23;
d2.Display();
d3.Display();
}
void Test4() //测试 += -=
{
Date d1(2015);
Date d2(2015,3,1);
Date d3;
d1 += (31 + 28);
d2 += 3;
d3 = d2;
d3 -= 4;
d1.Display();//3月1日
d2.Display();//3月4日
d3.Display();//2月28日
}
void Test5() //测试 前置后置++ 前置后置--
{
//Date d1(2015);
//Date d2(2012, 3, 1);
//Date d3= --d1;
//Date d4 = d2--;
//d1.Display(); //2014年12月31日
//d2.Display(); //2012年2月29日
//d3.Display(); //2014年12月31日
//d4.Display(); //2012年3月1日
Date d1(2015,12,31);
Date d2(2012, 2, 28);
Date d3 = ++d1;
Date d4 = d2++;
d1.Display(); //2016 1 1
d2.Display(); //2013 2 29
d3.Display(); //2016 1 1
d4.Display(); //2012 2 28
}
int main()
{
Test5();
system("pause");
return 0;
}