C++:日期类

学习目标:

加深对四个默认构造函数的理解:

1.构造函数

2.析构函数

3.拷贝构造

4.运算符重载

实现功能

1.比较日期的大小

2.日期+-天数

3.前/后置++,--

这里基本会使用运算符重载

定义一个日期类

class Date
{
public://1.全缺省参数的构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_day = day;_month = month;}//2.构造拷贝函数Date(const Date& x){_year = x._year;_month = x._month;_day = x._day;}//3.析构函数(这里可不构造)~Date() {}//4.运算符重载bool operator==(const Date& x);private:int _year;int _month;int _day;
};

1.比较日期的大小

比较日期大小,只用写大于,等于或者小于,等于,其它功能去复用就行(关系互斥)

--功能声明:

--等于实现:

//等于(d1 == d2;)
bool Date::operator==(const Date& x) 
{return this->_year == x._year&& this->_month == x._month&& this->_day == x._day;
}

--大于实现:

//大于(d1>d2)
bool Date::operator>(const Date& x) 
{if     ((_year > x._year)|| ((_year == x._year) && (_month > x._month))|| ((_year == x._year) && (_month == x._month) && (_day > x._day)))return true;elsereturn false;
}

--小于等于

//小于等于(d1<=d2)
bool Date::operator<=(const Date& x) 
{return !(*this > x);
}

--大于等于

//大于等于
bool Date::operator>=(const Date& x) 
{return (*this > x) || (*this == x);
}

--小于:

//小于(d1<d2)
bool Date::operator<(const Date& x) 
{return !(*this >= x);
}

--不等于:

//不等于
bool Date::operator!=(const Date& x) 
{return !(*this == x);
}

效果:

2.日期+-天数

准备工作:日期+-天数,要考虑到进位,借位,以及闰年,非闰年的月份天数问题:

给出函数:

--是否为闰年:

	//是否为闰年int is_leapyear(int year){if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)){return 1;}return 0;}

--获取月分的天数:
 

	//获取每一个月份的天数int GetMonthDay(int year, int month){int month_day[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//存放每个月的月份int is_leap = is_leapyear(year);if (is_leap && month == 2){return month_day[month] + 1;//是闰年,2月有29天}else{return month_day[month];//不是闰年且不是2月}}

功能声明:

这里同样可以实现复用:

写好+=后可以复用+,写好-=可以复用-

为什么不是+复用+=呢?

--+天数不改变原来日期,+=会改变,直接用+=复用的时候,拷贝一份,传+=后的即可

实现:

日期+=天数

//日期+=天数(d1 += 100)
Date Date::operator+=(int day) 
{	if (day < 0) {return *this -= -day;}//1.直接将天数加到该日期的月数中去_day += day;//2.判断是否超出当前月数的天数while (_day > GetMonthDay(_year,_month)) {//3.超出就进位,重复_day -= GetMonthDay(_year,_month);_month++;//处理年份if (_month == 13) {_month = 1;_year++;}}return *this;
}

日期+天数

//日期+天数(d1+100)
Date Date::operator+(int day) 
{//+,不改变date,拷贝一份Date ret(*this);ret += day;return ret;
}

日期-=天数:

//日期 -= 天数(	d1 - 100)
Date Date::operator-=(int day)
{if (day < 0) {return *this += -day;}//1.天减去天_day -= day;//2.判断是否违法,违法向前面借while (_day <= 0){_month--;//借月数if(_month <= 0){_year--;_month = 12;}//借天数_day += GetMonthDay(_year, _month);}return *this;
}

日期-天数:

//日期 - 天数(	d1 - 100)
Date Date::operator-(int day) 
{	//不改d1,拷贝一下Date tmp(*this);tmp -= day;return tmp;
}

日期-日期:

//日期-日期  -
int Date::operator-(const Date& d) 
{Date max = *this;Date min = d;int flag = 1;//1.找出较小的日期if (*this < min) {max = d;min = *this;flag = -1;}int n = 0;//2.让较小的日期一直+,直到等于较大的日期(加了多少次,它们就差了多少天)while (min != max) {++min;++n;}//flag用来处理大年减小年或小年减大年的情况return n*flag;}

赋值运算符重载(=)

//赋值
void Date::operator=(const Date& x) 
{_year = x._year;_month = x._month;_day = x._day;
}

效果:

3.前/后置++,--

前/后置++,--会有歧义:

如++运算符重载后的到底是前置++,还是后置++呢?

这里使用函数重载解决,改变形参来区分

这里说明一下为什么前置可以使用引用返回,后置却不行:

--前置会先改变d1,再++,直接把d1传回去就行了

--后置会先使用原来的,再++,所有要拷贝一份,传回去的是拷贝的tmp,出栈就销毁了,所有不能传引用

++:

//前置++
Date& Date::operator++() 
{*this += 1;return *this;
}//后置++
Date Date::operator++(int)
{Date tmp(*this);*this += 1;return tmp; 
}

--:

1

//前置--
Date& Date::operator--() 
{*this -= 1;return *this;
}//后置--
Date Date::operator--(int) 
{Date tmp(*this);*this -= 1;return tmp;
}

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/96154.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# NetTopologySuite+ProjNet 任意图形类型坐标转换

添加引用&#xff1a;NetTopologySuite、ProjNet、ProjNet.SRID Program.cs文件&#xff1a; using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using ProjNet.SRID; using System; using System.Collections.Generic; using System.Linq;…

程序员自由创业周记#2:前期准备

感恩 上次公开了创业的决定后&#xff0c;得到了很多亲朋好友和陌生朋友的鼓励或支持&#xff0c;以不同的形式&#xff0c;感动之情溢于言表。这些都会记在心里&#xff0c;大恩不言谢~ 创业方向 笔者是一名资质平平的iOS开发程序猿&#xff0c;创业项目也就是开发App卖&am…

WPF工控机textbox获得焦点自动打开软键盘

1.通过nuget安装 osklib.wpf 2.在textbox getFoucs中敲入如下代码即可实现获得焦点弹出软键盘 private void txtPLC_IP_GotFocus(object sender, RoutedEventArgs e){try{// Osklib.OnScreenKeyboard.Close();Osklib.OnScreenKeyboard.Show();}catch (Exception ex){MessageB…

Open3D(C++) 点云格网分块

目录 一、算法概述二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法概述 点云格网分块是点云二维格网化的一个具体应用案例,与Open3D (C++) 使用点云创建数字高程模型DEM类似,对每个格…

Linux中的基础IO

目录 1、关于C语言中的文件操作符 1.1 C语言中写文件 1.2 C语言读文件 1.3 往显示器上输出信息 1.4 stdin & stdout & stderr 1.5 打开文件的方式 2、系统文件IO 2.1 写操作文件 2.2 读操作文件、 2.3 open open函数的返回值 2.4 文件描述符 0 & 1 &a…

Swift 如何从图片数据(Data)检测原图片类型?

功能需求 如果我们之前把图片对应的数据(Data)保持在内存或数据库中,那么怎么从 Data 对象检测出原来图片的类型呢? 如上图所示:我们将 11 张不同类型的图片转换为 Data 数据,然后从 Data 对象正确检测出了原图片类型。 目前,我们的代码可以检测出 jpeg(jpg), tiff,…

【Java核心知识】ThreadLocal相关知识

ThreadLocal 什么是ThreadLocal ThreadLoacal类可以为每个线程保存一份独有的变量&#xff0c;该变量对于每个线程都是独占的。实现原理为每个Thread类中包含一个ThreadHashMap&#xff0c;key为变量的对应的ThreadLocal对象&#xff0c;value为变量的值。 在日常使用中&…

百度搜索清理大量低质量网站

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 据部分站长爆料&#xff1a;百度大规模删低质量网站的百度资源站长平台权限&#xff0c;很多网站都被删除了百度站长资源平台后台权限&#xff0c;以前在百度后台添加的网站大量被删除&#xff01;…

Anaconda常用命令及虚拟环境配置详细步骤

1、 pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple 使用上述语句进行安装速度快。 也可使用豆瓣源如下 pip install 库名版本号 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 2、 conda env list 查看所安装的环境 3、 conda list 查看…

Qt应用开发(基础篇)——消息对话框 QMessageBox

一、前言 QMessageBox类继承于QDialog&#xff0c;是一个模式对话框&#xff0c;常用于通知用户或向用户提出问题并接收答案。 对话框QDialog QMessageBox消息框主要由四部分组成&#xff0c;一个主要文本text&#xff0c;用于提醒用户注意某种情况;一个信息文本informativeTex…

学习振弦采集模块的开发基本原理

飞讯教学篇&#xff1a;学习振弦采集模块的开发基本原理 振弦采集模块是一种用于测量物体振动、形变、压力等物理量的电子设备。它通过测量物体的振动变化&#xff0c;可以得出物体在不同条件下的动态特性&#xff0c;对于工程设计、科学研究、医学检测等领域都有广泛应用。本…

css 左右宽固定,中间自适应——双飞翼布局

最近面试的时候遇到一个提问说&#xff0c;如何做到一个左右宽度固定&#xff0c;中间自适应的布局&#xff0c;我的答案不重要&#xff0c;重要的是不是面试官想听到的答案&#xff0c;这样问大概率他想听到的答案一定是双飞翼布局&#xff0c;所以今天就手敲一个双飞翼布局让…