格式:声明都在头文件里(.h),定义都在(.cpp)文件里。
规划:
1.先了解所要实现的功能。
2.每当我们完成一个模块就测试,早发现错误早修改错误。避免在后续数据庞大的时候检测,这样会更容易秃头,耗时也更多。
3.定义的传参,以及返回值,区间的合法性,运算时的一些偏差,这个就需要去调试解决。
4.优化代码(去掉重复部分,比如用函数调用)。修bug(检查越界),这个就很重要(不然就会成为这样)
既然要实现日期类,就要实现 日、月、年的判断以及运算。
class Day
{
public:
Day(int year = 1, int month = 1, int day = 1);//带参构造
int Get_day(int year, int month)const;//获取月份的天数 因为要判断闰年平年的天数
void Print()const;//打印
private:
int _year;
int _month;
int _day;
};
int Day::Get_day(int year, int month)const
{
assert(month > 0 && month < 13);
int monthArr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//只有闰年2月是29期他都不变
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400) == 0))
{
return 29;
}
else
{
return monthArr[month];
}
}
Day::Day(int year, int month, int day)
{
if (month > 0 && month < 13 && day > 0 && day <= Get_day(year, month))
{
_year = year;
_month = month;
_day = day;
}
else
{
cout << "日期不合法" << endl;
}
}
//格式自定
void Day::Print()const
{
cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
总体来说也是没有什么问题(实例化,非合法值的判断,打印)
在调用的时候先进入的是构造函数,在构造函数中拷贝的判断条件并没有进去所以打印日期不合法
而这个时候构造函数对内置类型不做处理,就把随机值给打印了出来
首先我们要想清楚我们需要用到什么条件运算符,还有条件运算符之间的关系。
利用函数的关系去构成函数重载;
//因为日期类里有3个变量,所以我们都要对这些变量进行对比才能判断
bool Day::operator==(const Day& d) const
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
//现在我们实现了==的条件运算符符,那么我们就可以附用他
bool Day::operator!=(const Day& d)const
{
return !(*this == d);//==取反就是!=
}
//这里也不例外先把一个条件实现出来然后就附用
bool Day::operator<(const Day& d)const
{
return _year < d._year
|| _year == d._year && _month < d._month
|| _year == d._year && _month == d._month && _day < d._day;
}
bool Day::operator<=(const Day& d)const
{
return (*this == d) || (*this < d);
}
bool Day::operator>(const Day& d)const
{
return !(*this <= d);
}
bool Day::operator>=(const Day& d)const
{
return *this > d || *this == d;
}
这里也是我们要想清楚我们需要实现什么功能用到什么运算符,还有运算符之间的关系。
//这个是重点
void Day::get_day(int day)
{
while (_day<=0 ||_day > Get_day(_year, _month))
{
if (_day > 0)
{
_day -= Get_day(_year, _month);
_month++;
if (_month == 13)
{
_year++;
_month = 1;
}
}
else
{
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day += Get_day(_year, _month);
}
}
}
Day& Day:: operator+=(int day)//引用返回就是要返回本身,因为+=,-=都要对改变自己不本身
{
if (day < 0)
{
_day -= -day; //+=一个负数就是-=一个整数
get_day(_day);
return *this;
}
_day += day;
get_day(_day);
return *this;
}
Day Day:: operator+(int day)const
{
Day tmp(*this);//实例化this,拷贝this(这里不用改变自己就不用返回引用)
tmp += day;
return tmp;
}
Day& Day::operator-=(int day)
{
if (day < 0)
{
_day += -day;
get_day( _day);
return *this;
}
_day -= day;
get_day(_day);
return *this;
}
Day Day::operator-(int day)const
{
Day tmp(*this);
tmp -= day;
return tmp;
}
Day& Day::operator++()//前置
{
*this += 1;
return *this;
}
Day Day::operator++(int)const//后置
{
Day tmp(*this);
tmp += 1;
return tmp;
}
Day& Day::operator--()//前置
{
*this -= 1;
return *this;
}
Day Day::operator--(int)const//后置
{
Day tmp(*this);
tmp -= 1;
return tmp;
}
int Day::operator-(const Day& d)const
{
Day max(*this);
Day min(d);
int flag = 1;
if (*this < d)
{
max = d;
min = *this;
flag = -1;
}
int tmp = 0;
while (min != max)
{
++min;
++tmp;
}
return tmp;
}
#pragma once
#include
using namespace std;
#include
class Day
{
public:
Day(int year = 1900, int month = 1, int day = 1);//合法日期
int Get_day(int year, int month)const;//拿到闰年平年的月份
void Print()const;
//运算符重载
bool operator>(const Day& d)const;
bool operator<(const Day& d)const;
bool operator>=(const Day& d)const;
bool operator<=(const Day& d)const;
bool operator==(const Day& d)const;
bool operator!=(const Day& d)const;
Day operator+(int day)const;
Day operator-(int day)const;
Day& operator+=(int day);
Day& operator-=(int day);
Day& operator++();//前置
Day operator++(int)const;//后置
Day& operator--();//前置
Day operator--(int)const;//后置
int operator-(const Day& d)const;
void get_day(int day);//运算
private:
int _year;
int _month;
int _day;
};
#include"day_2.h"
int Day::Get_day(int year, int month)const
{
assert(month > 0 && month < 13);
int montharr[13] = { 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 montharr[month];
}
}
Day::Day(int year, int month, int day)//详细讲
{
if (month > 0 && month < 13 && day>0&&day <= Get_day(year, month))
{
_year = year;
_month = month;
_day = day;
}
else
{
cout << "日期不合法" << endl;
}
}
void Day::Print()const
{
cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
bool Day::operator==(const Day& d) const
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
bool Day::operator!=(const Day& d)const
{
return !(*this == d);
}
bool Day::operator<(const Day& d)const
{
return _year < d._year
|| _year == d._year && _month < d._month
|| _year == d._year && _month == d._month && _day < d._day;
}
bool Day::operator<=(const Day& d)const
{
return (*this == d) || (*this < d);
}
bool Day::operator>(const Day& d)const
{
return !(*this <= d);
}
bool Day::operator>=(const Day& d)const
{
return *this > d || *this == d;
}
void Day::get_day(int day)
{
while (_day<=0 ||_day > Get_day(_year, _month))
{
if (_day > 0)
{
_day -= Get_day(_year, _month);
_month++;
if (_month == 13)
{
_year++;
_month = 1;
}
}
else
{
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day += Get_day(_year, _month);
}
}
}
Day& Day:: operator+=(int day)
{
if (day < 0)
{
_day -= -day;
get_day(_day);
return *this;
}
_day += day;
get_day(_day);
return *this;
}
Day Day:: operator+(int day)const
{
Day tmp(*this);//实例化this
tmp += day;
return tmp;
}
Day& Day::operator-=(int day)
{
if (day < 0)
{
_day += -day;
get_day( _day);
return *this;
}
_day -= day;
get_day(_day);
return *this;
}
Day Day::operator-(int day)const
{
Day tmp(*this);
tmp -= day;
return tmp;
}
Day& Day::operator++()//前置
{
*this += 1;
return *this;
}
Day Day::operator++(int)const//后置
{
Day tmp(*this);
tmp += 1;
return tmp;
}
Day& Day::operator--()//前置
{
*this -= 1;
return *this;
}
Day Day::operator--(int)const//后置
{
Day tmp(*this);
tmp -= 1;
return tmp;
}
int Day::operator-(const Day& d)const
{
Day max(*this);
Day min(d);
int flag = 1;
if (*this < d)
{
max = d;
min = *this;
flag = -1;
}
int tmp = 0;
while (min != max)
{
++min;
++tmp;
}
return tmp;
}