主页 > 电脑硬件  > 

【C++】实现Date类的各种运算符重载


上一篇文章只实现了operator==操作符重载,由于运算符较多,该篇文章单独实现剩余所有的运算符重载。继续以Date类为例,实现运算符重载: 1.Date.h

#pragma once #include <iostream> #include <assert.h> using namespace std; class Date { private: int _year; int _month; int _day; public: void Print(); Date(int yaer, int month, int day); bool operator<(const Date& d); bool operator<=(const Date& d); bool operator>(const Date& d); bool operator>=(const Date& d); bool operator==(const Date& d); bool operator!=(const Date& d); //单独的用一个函数把每个月多少天,封装起来 int GetMonthDays(int year, int month) { assert(month > 0 && month < 13); static int MonthDay[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; if (month==2&&(year % 4 == 0 && year % 100 != 0)) { return 29; } return MonthDay[month]; } Date& operator+=(int day); Date operator+(int day); Date& operator-=(int day); Date operator-(int day); //++d,前置++ Date& operator++(); //d++,后置++ Date operator++(int); //前置-- Date& operator--(); //后置-- Date operator--(int); //两个日期相减:d1-d2 int operator-(const Date& d); };

Date.cpp

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "Date.h" void Date::Print() { cout << _year << "/" << _month << "/" << _day << endl; } Date::Date(int year=1, int month=1, int day=1) { _year = year; _month = month; _day = day; } // 写好一个直接复用!!! bool Date::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) && (_day < d._day)) return true; else return false; } else return false; } bool Date::operator==(const Date& d) { if ((_year == d._year) && (_month == d._month) && (_day == d._day)) return true; else return false; } bool Date::operator<=(const Date& d) { return *this == d || *this < d; } bool Date::operator>(const Date& d) { return !(*this <= d); } bool Date::operator>=(const Date& d) { return (*this > d || *this == d); } bool Date::operator!=(const Date& d) { return !(*this == d); } Date& Date::operator+=(int day) { _day += day;//先加 //这里是while,因为如果是if的话,如果一次加了很大的数据减一次不一定能减得完!!! while(_day > GetMonthDays(_year, _month)) { _day -= GetMonthDays(_year, _month); ++_month; if (_month == 13) { ++_year; _month = 1; } } return *this; } Date Date::operator+(int day) { Date tmp=*this; tmp += day; return tmp; } Date& Date::operator-=(int day) { _day -= day; while (_day <= 0) { --_month; if (_month == 0) { --_year; _month = 12; } _day += GetMonthDays(_year, _month); } return *this; } Date Date::operator-(int day) { Date tmp = *this; tmp -= day; return tmp; } Date& Date::operator++() { return *this += 1; } Date Date::operator++(int) { Date tmp = *this; *this += 1; return tmp; } Date& Date::operator--() { *this - 1; return *this; } Date Date::operator--(int) { Date tmp = *this; *this -= 1; return tmp; } //日期-日期,计算两个日期之间相差多少天 int Date::operator-(const Date& d) { int flag = 1; Date max = *this; Date min = d; if (*this < d) { //赋值为-1的原因:因为这个函数是有顺序的d1-d2,如果遇到d1<d2,也就是小减大,最终返回的结果是个负数,所以说这里要变成-1。 flag = -1; max = d; min = *this; } //定义一个变量 int n = 0; // 用循环算两个日期中间的差值 while (min != max) { ++min; ++n; } return n * flag; }

3.Test.cpp

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "Date.h" int main() { Date d1(2024, 2, 15); Date d2 = d1 + 20; d1.Print(); d2.Print(); bool ret=d1 > d2; if (ret) { d1.Print(); } d2 += 100; d2.Print(); d2 -= 100; d2.Print(); Date d3 = d2 - 10; d3.Print(); Date d4(2024, 1, 29); Date d5(2024, 8, 1); cout << d5 - d4 << endl; ++d5; d5.Print(); d5++; d5.Print(); --d5; d5.Print(); d5--; d5.Print(); return 0; }
标签:

【C++】实现Date类的各种运算符重载由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++】实现Date类的各种运算符重载