C++日期类
Posted -A7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++日期类相关的知识,希望对你有一定的参考价值。
1.Date中的构造函数
在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数,但是对于日期类,这里默认构造函数什么也不做,如果你创建了一个Date d1,系统调用了默认构造函数,你会发现在这里年月日都是随机值,我们为了让d1在初始化的时候就有一个确认的日期,所以自己要写一个全缺省的构造函数,我们在函数说明中给一个确定的值,让每个创建出来的日期类变量都有一个默认的初始值1900.1.1
2.Date中的析构函数
析构函数的作用同构造函数是对应的,这里是销毁某些特定的成员变量,如我们用malloc申请出来的内存,如果不在析构函数中做特定的操作,就很可能导致内存泄漏,不过在Date中的成员并不需要特殊的去释放他,他们生长在栈上,会随函数栈桢的结束自动释放掉,所以这里就可以使用默认的析构函数,我们可以不用书写。
3.Date中的拷贝构造函数
如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数。大多数情况下,其作用是实现从源对象到目标对象逐个字节的复制,即使得目标对象的每个成员变量都变得和源对象相等。编译器自动生成的复制构造函数称为“默认拷贝构造函数”。
拷贝构造函数必须使用传引用的方式返回,否则会造成无限递归
源码实现
**```
// An highlighted block
#include<iostream>
using namespace std;
class Date
{
friend ostream& operator<<(ostream& out, const Date& d);
public:
Date(int year = 1900, int month = 1, int day = 1)
{
m_year = year;
m_month = month;
m_day = day;
}
Date(const Date& d)
{
m_year = d.m_year;
m_month = d.m_month;
m_day = d.m_day;
}
//Date& operator=(const Date &d);
~Date()
{}
public:
bool IsLeap(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
return false;
}
int GetDayByYearMonth(int year, int month)
{
int days[13] = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month == 2)
{
if (IsLeap(year))
month = 0;
}
return days[month];
}
public:
Date operator+(int n) //日期+n天
{
int year = m_year;
int month = m_month;
int day = m_day;
int days = GetDayByYearMonth(year, month);
while (day + n > days)
{
month++;
if (month > 12)
{
year++;
month = 1;
}
n -= days;
days = GetDayByYearMonth(year, month);
}
day += n;
return Date(year, month, day);
}
Date& operator+=(int n)
{
Date tmp = *this + n;
*this = tmp;
return *this;
}
Date& operator++()
{
*this += 1;
return *this;
}
Date operator++(int)
{
Date tmp = *this;
++* this;
return tmp;
}
public:
Date operator-(int n); //日期-n天
Date& operator-=(int n);
Date& operator--();
Date& operator--(int);
Date operator-(const Date& d);
public:
int GetWeek(int year, int month, int day); //星期几
public:
bool operator>(const Date& d)
{
if ((m_year > d.m_year)
|| (m_year == d.m_year && m_month > d.m_month)
|| (m_year == d.m_year && m_month == d.m_month && m_day > d.m_day))
return true;
return false;
}
bool operator <= (const Date& d)
{
return !(*this > d);
}
bool operator<(const Date& d)
{
if ((m_year < d.m_year)
|| (m_year == d.m_year && m_month < d.m_month)
|| (m_year == d.m_year && m_month == d.m_month && m_day < d.m_day))
return true;
return false;
}
bool operator >= (const Date& d)
{
return !(*this < d);
}
bool operator==(const Date& d)
{
return (m_year == d.m_year && m_month == d.m_month && m_day == d.m_day);
}
bool operator!=(const Date& d)
{
return !(*this == d);
}
private:
int m_year;
int m_month;
int m_day;
};
ostream& operator<<(ostream& out, const Date& d)
{
out << d.m_year << "年" << d.m_month << "月" << d.m_day << "日";
return out;
}
void main()
{
Date dt1(2021, 10, 19);
cout << "dt1 = " << dt1 << endl;
//Date dt = dt1 + 13;
//cout<<"dt = "<<dt<<endl;
//dt1 += 100;
Date dt2 = dt1++;
cout << "dt1 = " << dt1 << endl;
cout << "dt2 = " << dt2 << endl;
}
```****
以上是关于C++日期类的主要内容,如果未能解决你的问题,请参考以下文章