在写日期类日期计算器之前先实现了一个简单的复数类 //引用做参数,1.swap--在函数内部改变参数,2.Bigdata提高效率 //内联函数必须在定义处加上inline //定义在类内部的函数默认为内联函数 //c++中尽量使用const,枚举,内联去替代宏 //宏没有类型安全的检查,在预处理的时候替换了所以无法调试,宏安全性不高

class Complex
{
public:
Complex(double real = 0.0, double image = 0.0)//定义了一个全缺省的构造函数
:_real(real)
, _image(image)
{
cout << "Complex()" << endl;//这样可以在屏幕上输出构造函数的信息,方便分析构造函数的调用
}

Complex(const Complex& c)//拷贝构造函数
{
cout << "Complex(const Complex& c)" << endl;
_real = c._real;
_image = c._image;
}

~Complex()//析构函数
{
cout << "~Complex()" << endl;
}

Complex& operator=(const Complex& c)// Complex返回值支持连续的赋值
{
cout << "Complex& operator=()" << endl;
if (this != &c)
{
_real = c._real;
_image = c._image;
}

return *this;
}
void Display()
{
cout << _real << "-" << _image << this-="">_real++;
this->_image++;
return *this;
}
Complex operator++(int)//后置++,返回加之前的值,int用来占位,形成重载
{
Complex ret(*this);
this->_real++;
this->_image++;
return ret;
}

bool operator== (const Complex& c)
{
IsEqual(c);
}
bool IsEqual(const Complex& c)
{
return _image == c._image&&_real == c._real;
}

bool operator> (const Complex& c)
{
MoreThan(c);
}

bool MoreThan(const Complex& c)
{
if (_real > c._real)
{
return true;
}
else if (_real == c._real
&&_image > c._image)
{
return true;
}
return false;
}

Complex operator+ (const Complex& c)
{
/*Complex ret;
ret._real = _real + c._real;
ret._image = _image + c._image;*/

Complex ret(*this);
ret._real += c._real;
ret._image += c._image;
return ret;
}

Complex& operator+= (const Complex& c)
{
_real += c._real;
_image += c._image;
return *this;
}

private:
double _real;
double _image;
};
class Date
{
public:
/*Date()
{
cout << "Date()" << endl;
}*/
Date(int year = 1900, int month = 1, int day = 1)
        //使用初始化列表更高效
//必须使用初始化列表初始化的成员变量
        //1.常量成员变量
//2.引用类型成员变量
//3.没有缺省的构造函数的类成员变量
{
//cout << "Date(int year = 1900, int month = 1, int day = 1)" << if="" year=""> 1900
&& month > 0 && month<13 day="">0 && day <= GetMonthDay(year, month))
{
_year = year;
_month = month;
_day = day;
}
else
{
cout << "非法日期" << endl;
}
}

Date(const Date& d)
{
//cout << "Date(const Date& d)" << endl;
_year = d._year;
_month = d._month;
_day = d._day;
}

Date& operator=(const Date& d)
{

//cout << "Date& operator=(const Date& d)" << endl;
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}

~Date()
{
//cout << "~Date" << void="" -=""> const Date* this
{
cout << _year << "-" << _month << "-" << _day << public:="" bool="" operator="" return="" _year="=" d._year="" _month="=" d._month="" _day="=" const="" this="="> (const Date& d)
{
//if (_year > d._year)
//{
//return true;
//}
//else
//{
//if (_year == d._year)
//{
//if (_month > d._month)
//return true;
//else
//{
//if (_month == d._month)
//{
//if (_day > d._day)
//return true;
//}
//}
//}
//}
//return false;
return (_year > d._year)
|| ((_year == d._year) && (_month > d._month))
|| ((_year == d._year) && (_month == d._month) && (_day > d._day));
}
bool operator >= (const Date& d)
{
return (*this > d) || (*this == d);
}
bool operator <(const return="" this="">= d);
}
bool operator<=(const return="" this=""> d);
}
//日期计算器
Date operator+(int day)
{

if (day<0) return="" this="" -="" date="" tmp._day="" while="">GetMonthDay(tmp._year, tmp._month))
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);

if (tmp._month == 12)
{
tmp._year++;
tmp._month = 1;
}
else
{
++tmp._month;
}
}
return tmp;
}

Date& operator+=(int day)
{
/*if (day < 0)
{
return *this - (-day);
}

_day += day;
while (_day > GetMonthDay(_year, _month))
{
_day -= GetMonthDay(_year, _month);

if (_month == 12)
{
_year++;
_month = 1;
}
else
{
++_month;
}
}
return *this;*/
*this =*this + day;
return *this;
}


{
if (day < 0)
{
return *this + (-day);
}
Date operator-(int day)
Date tmp(*this);
tmp._day -= day;
while (tmp._day <= 0)
{

if (tmp._month == 1)
{
tmp._year--;
tmp._month = 12;
}
else
{
tmp._month--;
}
tmp._day += GetMonthDay(tmp._year, (tmp._month));
}
return tmp;
}
Date& operator-=(int day)
{
/*if (day < 0)
{
return *this + (-day);
}
_day -= day;
while (_day < 0)
{
_day += GetMonthDay(_year, (--_month));
if (_month == 1)
{
_year--;
_month = 12;
}
else
{
_month--;
}
}
return *this;*/
*this =*this - day;
return *this;
}

Date operator++() //前置++
{
*this += 1;
return *this;
}
Date operator++(int)//后置++
{
/*
Date tmp(*this);
tmp._day += 1;

while (_day > GetMonthDay(tmp._year, tmp._month))
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);
if (tmp._month == 12)
{
tmp._year++;
tmp._month = 1;
}
else
{
tmp._month++;
}
}

return tmp;*/
Date tmp(*this);
*this += 1;
return *this;
}

Date operator--()//前置--
{
*this -= 1;
return *this;
}
Date operator--(int)//后置--
{
/*Date tmp(*this);
tmp._day -= 1;
while (tmp._day < 0)
{
tmp._day += GetMonthDay(tmp._year, (--tmp._month));
if (tmp._month == 1)
{
tmp._year--;
tmp._month = 12;
}
else
{
tmp._month--;
}
}
return tmp;*/
Date tmp(*this);
*this -= 1;
return *this;
}

int operator-(const Date& d)
{
int flag = 1;
Date max = *this;
Date min = d;

if (max < min)
{
swap(max._year, min._year);
swap(max._month, min._month);
swap(max._day, min._day);

flag = -1;
}
int days = 0;
while (min != max)
{
++min;
++days;
}
return days*flag;
}
private:
bool _IsLeapyear(int year)
{
if ((year % 4 == 0 && year % 100 != 0)
|| year % 400 == 0)
return true;
}

int GetMonthDay(int year, int month)
{
int monthArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day = monthArray[month];
if (month == 2 && _IsLeapyear(year))
{
day += 1;
}
return day;
}

private:
int _year;
int _month;
int _day;
};