类和对象,可以说是C++语言很重要的一环,但是在这里不做过多的讲解,仅仅提供一个时间的实现来体会,主要涉及的是 析构函数,构造函数,拷贝构造函数,和各种的重载(如前置与后置等诸多问题)
附带有简单的讲解,希望对你学习类与对象有所帮助。
using namespace std; #include<iostream> #include<assert.h> class Date { public: // 获取某年某月的天数 这个函数是很关键的,有助于获取具体哪一个月的天数有几天,方便于后续的操作 int GetMonthDay(int year,int month) { assert(month > 0 && month < 13); int array[] = { 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)) { array[2] = 29; } return array[month]; } // 构造函数 Date(int year , int month , int day ) { //对于不合法构造的检查 assert(month > 0 && month < 13); assert(day > 0 && day <= GetMonthDay(year, month)); _year = year; _month = month; _day = day; } // 拷贝构造函数 拷贝构造,传的是引用,有助于效率的提升 Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } // 赋值运算符重载 传引用,传出引用,有助于更加高效 Date& operator=(const Date& d) { if (this!=&d) { _year = d._year; _month = d._month; _day = d._day; } return *this; } // 析构函数 ~Date() { _year = 0; _month = 0; _day = 0; } // 日期 += 天数(于本身做修改) Date& operator+=(int day) { _day += day; while (_day > GetMonthDay(_year, _month)) { _day -= GetMonthDay(_year, _month); _month++; if (_month == 13) { _year++; _month = 1; } } return *this; } // 日期+天数 Date operator+(int day) { Date tmp = *this; tmp._day += day; while (tmp._day > GetMonthDay(tmp._year, tmp._month)) { tmp._day -= GetMonthDay(tmp._year, tmp._month); ++tmp._month; if (tmp._month == 13) { ++tmp._year; tmp._month = 1; } } return tmp; } // 日期-天数 Date operator-(int day) { Date tmp = *this; tmp._day -= day; while (tmp._day <= 0) { tmp._month--; if (tmp._month == 0) { tmp._month = 12; tmp._year--; } tmp._day += GetMonthDay(tmp._year,tmp._month); } return tmp; } // 日期-=天数 Date& operator-=(int day) { _day -= day; while (_day <= 0) { _month--; if (_month == 0) { _month = 12; _year--; } _day += GetMonthDay(_year, _month); } return *this; } // 前置++ Date& operator++() { _day++; if (_day > GetMonthDay(_year, _month)) { _day -= GetMonthDay(_year, _month); if (_month == 12) { _year++; _month = 1; } else { _month++; } } return *this; } // 后置++ Date operator++(int) { Date tmp = *this; tmp._day++; if (tmp._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 operator--(int) { Date tmp = *this; if (tmp._day == 1) { if (tmp._month == 1) { tmp._year--; tmp._month = 12; tmp._day = 31; } else { tmp._month--; } } else { tmp._day--; } return tmp; } // 前置-- Date& operator--() { if (_day == 1) { if (_month == 1) { _year--; _month = 12; _day = 31; } else { _month--; _day = GetMonthDay(_year, _month); } } else { _day--; } return *this; } // >运算符重载 第一个的完成很关键,之后可以复用 bool operator>(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; } // ==运算符重载 bool operator==(const Date& d) { if (_year == d._year && _month == d._month && _day == d._day) return true; return false; } // >=运算符重载 bool operator >= (const Date& d) { if (operator>(d) || operator==(d)) return true; return false; } // <运算符重载 bool operator < (const Date& d) { if (operator>(d) || operator==(d)) return false; return true; } // <=运算符重载 bool operator <= (const Date& d) { if (operator>(d)) return false; return true; } // !=运算符重载 bool operator != (const Date& d) { /* if (_year == d._year && _month == d._month && _day == d._day) return false; return true;*/ if (operator==(d)) return false; return true; } // 日期-日期 返回天数 这个思路比较巧妙 int operator-(const Date& d) { int flag = 1; Date max = *this; Date min = d; if (*this < d) { max = d; min = *this; flag = -1; } int day = 0; while (min < max) { ++(min); ++day; } return day * flag; } //打印日期 void Print() { cout << _year <<"/" << _month <<"/" << _day << endl; } private: int _year; int _month; int _day; };