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++日期类的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段中调用 getSupportFragmentManager()?

在片段中创建日期选择器

常用python日期日志获取内容循环的代码片段

这些 C++ 代码片段有啥作用?

有趣的 C++ 代码片段,有啥解释吗? [复制]

以下代码片段 C++ 的说明