C++类与对象——日期类
来源:互联网 发布:java计算总金额 编辑:程序博客网 时间:2024/06/14 02:35
两个日期类比较大小通过对C++类与对象的学习和思考。实际生活问题运用所学,将日期分装成一个类,完成简单的计算。
C++编写一个日期类,可以完成一些基础的日期计算,一个日期是否合法,闰年天数,两个日期相差的天数,日期的比较,日期前后多少天的计算等。
#pragma once #include<assert.h>class Date{public: Date(int year=1900, int month=1, int day=1) //构造函数以及初始化列表 : _year(year) , _month(month) , _day(day) { assert(IsInvalid()); //判断日期是否合法 } 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 operator+(const int day) //日期类加一个整型天数 { if (day < 0) { return *this - (-day); } Date tmp(*this); tmp._day += day; while (tmp.IsInvalid() == false) { tmp._day -= GetMonthDays(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); Date tmp(*this); tmp._day -= day; while (tmp.IsInvalid() == false) { if (tmp._month == 1) { tmp._year--; tmp._month = 12; } else { tmp._month--; } int day = GetMonthDays(tmp._year, tmp._month); tmp._day += day; } return tmp; } Date& operator +=(int day) //日期类+=一个整型天数 { return *this = *this + day; } Date& operator -=(int day) { return *this = *this - day; } Date& operator ++() //日期类前置++ { return *this += 1; } Date operator ++(int) //日期类后置++ { Date tmp(*this); *this += 1; return tmp; } Date& operator --() //日期类前置-- { return *this -= 1; } Date operator--(int) //日期类后置-- { Date tmp(*this); *this -= 1; return tmp; } int operator-(const Date& d) //两个日期类相减相差天数 { Date tmp(*this); int a = 0; if (_year >= d._year) { if (d._month == tmp._month && d._year == tmp._year) return tmp._day - d._day; tmp._month--; while (!((tmp._year==d._year)&&(tmp._month==d._month))) { a += GetMonthDays(tmp._year, tmp._month); tmp._month--; if (tmp._month == 0) { tmp._month = 12; tmp._year--; } } return a + tmp._day + (GetMonthDays(d._year, d._month) - d._day); } else { tmp = d; tmp._month--; while (!((tmp._year == _year) && (tmp._month == _month))) { a += GetMonthDays(tmp._year, tmp._month); tmp._month--; if (tmp._month == 0) { tmp._month = 12; tmp._year--; } } return -(a + tmp._day + (GetMonthDays(_year, _month) - _day)); } } void Display() //打印一个日期类 { cout << _year << "/" << _month << "/" << _day << endl; } bool IsInvalid() //判断一个日期是否合法 { if (_year >= 1900 && _month > 0 && _month<13 && _day>0 && _day <= GetMonthDays(_year, _month)) { return true; } return false; } int GetMonthDays(int year, int month) //判断是否为闰年,二月天数改变 { static int _monthDates[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month != 2) { return _monthDates[month]; } else { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { return _monthDates[2] + 1; } return _monthDates[2]; } } bool operator>(const Date& d) //两个日期类比较大小 { if (_year > d._year) return true; else if (_year < d._year) return false; else { if (_month>d._month) return true; else if (_month < d._month) return false; else { if (_day>d._day) return true; else if (_day < d._day) return false; else return false; } } } bool operator<(const Date& d) //两个日期类比较大小 { if (_year < d._year) return true; else if (_year > d._year) return false; else { if (_month<d._month) return true; else if (_month > d._month) return false; else { if (_day < d._day) return true; else if (_day > d._day) return false; else return false; } } } bool operator==(const Date& d) //两个日期类是否相等 { if (d._year == _year&&d._day == _day&&d._month == _month) return true; return false; } bool operator>=(const Date& d) //两个日期类比较大小 { if (_year > d._year) return true; else if (_year < d._year) return false; else { if (_month>d._month) return true; else if (_month < d._month) return false; else { if (_day>d._day) return true; else if (_day < d._day) return false; else return true; } } } bool operator<=(const Date& d) //两个日期类比较大小 { if (_year < d._year) return true; else if (_year > d._year) return false; else { if (_month<d._month) return true; else if (_month > d._month) return false; else { if (_day < d._day) return true; else if (_day > d._day) return false; else return true; } } } ~Date() //析构函数 { }private: int _year; int _month; int _day;};
需要注意:
在判断一个日期是否合法,首先需要判断是够为闰年,其次在判断天数是否合法。
两个日期类相差天数,先判断日期大小,然后在确定返回值,两个日期类相差天数=两日期类中月之间月的天数+第一个日期类的天数+第二个日期类当月的天数减去第二个类的天数。(例如日期类d1(2017,8,24)和日期类d2(2017,5,5)之间的天数,相当于2017年6,7月天数之和+24天+(5月天数-5))。
日期类的比较返回值为布尔值。
日期类的打印也可以修改成输入输出流的运算符重载。
阅读全文
0 0
- C++类与对象——日期类
- 类与对象3(日期类)
- C++-类与对象
- C++:类与对象
- C++(类与对象)
- 【c++】类与对象
- C++-类与对象
- 类和对象—日期类
- 黑马程序员——Objective-C中的类与对象
- Object-C基础(7)——类与对象
- Objective-C 学习笔记(1)——类与对象
- 【C++】日期类+日期万年历+日期计算器
- C++_对象与类
- Objective-c 对象与类
- object-c类与对象
- C++_类与对象
- 【C++】类与对象基础
- C++__类与对象
- Airflow 初试
- 详解jdbcTemplate和namedParameterJdbcTemplate
- MyEclipse10和MyEclipse2014项目之间的导入
- FZU-2254 英语考试
- Shape Correspondence and Functional Maps
- C++类与对象——日期类
- Lucene查询索引
- Android 使用RecyclerView实现列表item重叠效果(使用addItemDecoration方法)
- IO多路复用
- HDU 6180 && 2017 多校训练:Schedule
- Android:30分钟弄明白Touch事件分发机制(转)
- 图像项目-基于opencv的人脸识别
- windows PhpStorm 背景颜色变黑色
- sublime text3 安装配置svn 及默认快捷键