默认成员函数的练习之实现日期类

实现日期类

// Date.h
#define  _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<assert.h>using namespace std;class Date
{
public://构造函数Date(int year = 1, int month = 1, int day = 1);// 因为日期类没有涉及资源开销,所以不需要写拷贝构造和析构函数//打印void Print();// 赋值重载Date& 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);bool operator!=(const Date& d);//查找每个月的天数,直接定义在类中,默认其是内联函数(因为要多次调用)int GetMonthDay(int year, int month){assert(month > 0 && month < 13);//用static修饰,固定在静态区,避免每次调用函数都创建一个数组static int monthDayArray[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){ // 考虑闰年的情况,并且细节的是先判断是不是二月return 29;}elsereturn monthDayArray[month];}//日期加等整数Date& operator+=(int day);//日期加整数Date operator+(int day);//日期减等整数Date& operator-=(int day);//日期减整数Date operator-(int day);//日期前置++Date& operator++();//日期后置++Date operator++(int); //日期前置--Date& operator--();//日期后置--Date operator--(int);//日期减日期int operator-(const Date& d);private:int _year;int _month;int _day;
};
// Date.cpp
#define  _CRT_SECURE_NO_WARNINGS 1
#include"Date.h"Date::Date(int year, int month, int day) // 1.要加上访问限定符 2. 声明写缺省值,实现不写
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "/" << _month << "/" << _day << endl;
}Date& Date::operator=(const Date& d)// 1.加上返回值,可实现连续赋值 2.使用引用传参减少拷贝构造函数的调用
{if (this != &d) // 防止出现自己给自己赋值的情况{_year = d._year;_month = d._month;_day = d._day;}return *this;
}bool Date::operator<(const Date& d)
{if (_year < d._year){return true;}else if (_year == d._year&& _month < d._month){return true;}else if (_year == d._year&& _month == d._month&& _day < d._day){return true;}return false;
}bool Date::operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}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);
}bool Date::operator!=(const Date& d)
{return !(*this == d);
}Date& Date::operator+=(int day)
{if (day < 0){return *this -= -day; // 传入的日期为负数,复用-=(下面实现)}_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);_month++;if (_month == 13){_year++;_month = 1;}}return *this; // 返回增加day天数后的日期
}Date Date::operator+(int day) // 这里就不可以用引用做返回值了,原因是tmp出了函数作用域就被销毁
{Date tmp = *this; // 拷贝构造return tmp += day;
}Date& Date::operator-=(int day)
{if (day < 0){return *this += -day;}_day -= day;while (_day < 0){_month--;if (_month == 0){_year--;_month = 12;}_day += GetMonthDay(_year, _month); // 这个要放在后面}return *this;
}Date Date::operator-(int day)
{Date tmp = *this;return tmp -= day;
}Date& Date::operator++()
{return *this += 1;
}Date Date::operator++(int) // 参数的目的是构成函数重载
{Date tmp = *this;*this += 1;return tmp; // 注意返回值
}Date& Date::operator--()
{return *this -= 1;
}Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp; 
}int Date::operator-(const Date& d)
{//假设一个大的Date max = *this;Date min = d;int flag = 1;if (*this < d) // 说明假设错误{max = d;min = *this;flag = -1;}int n = 0;while (min != max){++min;++n;}return n * flag;
}
//test.cpp
#define  _CRT_SECURE_NO_WARNINGS 1
#include"Date.h"int main()
{Date d1(2024, 9, 27);d1.Print();Date d2 = d1; // 使用默认的拷贝构造//Date d2(d1);d2.Print();Date d3(2024, 9, 28);//d3 = d1; // 测试赋值重载//d3.Print();Date d4(2024, 9, 30);d4 = d3 = d1; // 连续赋值d4.Print();bool ret = d3 > d4;cout << ret << endl; // 0Date d5(2024, 10, 1);Date ret2 = d5 -= 100;ret2.Print(); // 2024/6/23Date year(2025, 1, 29);int ret3 = d3 - year;cout << ret3 << endl;Date birth(2005, 8, 23); // 可计算你在这个世界上已经存活多少天int ret4 = d3 - birth;cout << ret4 << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Echarts】折线图和柱状图如何从后端动态获取数据?

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;Web前端开发 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1.1 前端数据分析 1.2 数据库表分析 1.3 后端数据处理 1.4 前端接收数据 继上一篇文章&…

Linux入门2——初识Linux权限

目录 0. Linux下的用户 1.文件访问者的分类 2.文件类型和访问权限 3. 文件权限值的表示方法 4.文件访问权限的相关设置方法 4.1 修改文件的访问权限 4.2修改文件的拥有者和所属组 0. Linux下的用户 在学习Linux权限之前&#xff0c;我们要先来了解Linux下的用户&#x…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款旅游类智能体的开发,来体验一下我的智能体『​​​​​​​厦门CityWalk』

目录 1.1、智能体运行效果 1.2、创作灵感来源 1.3、如何制作智能体 1.4、可能会遇到的几个问题 1.5、快速调优指南 『厦门CityWalk&#x1f680;』我的优质智能体&#xff1a;https://0nxj3k.smartapps.baidu.com/?_swebfr1&_swebScene3621000000000000 在当今这个全…

智慧水利综合解决方案

1. 智慧水利综合解决方案概述 智慧水利综合解决方案旨在通过集成先进技术&#xff0c;实现水利管理的智能化和高效化。该方案涵盖平台建设、业务系统建设和系统集成服务三大应用场景&#xff0c;通过数字孪生、GIS平台开发等技术手段&#xff0c;全面提升水利行业的管理能力和…

Elasticsearch学习笔记(2)

索引库操作 在Elasticsearch中&#xff0c;Mapping是定义文档字段及其属性的重要机制。 Mapping映射属性 type&#xff1a;字段数据类型 1、字符串&#xff1a; text&#xff1a;可分词的文本&#xff0c;适用于需要全文检索的情况。keyword&#xff1a;用于存储精确值&am…

找不到msvcp110.dll怎么办,总结6种解决msvcp110.dll的方法

在电脑使用过程中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中之一就是系统提示某个文件丢失。msvcp110.dll丢失是一个比较常见的问题&#xff0c;它可能导致某些程序无法正常运行。那么&#xff0c;如何解决这个问题呢&#xff1f;本文将详细介绍6种修复msvcp11…

Yolov10环境配置

参考文章&#xff1a;1.YOLOv10超详细环境搭建以及模型训练&#xff08;GPU版本&#xff09;-CSDN博客 2.Windows下安装pytorch教程(下载.whl的方式)_pytorch whl-CSDN博客 安装步骤和文件夹顺序一样 1.安装CUDA和cuDNN 1.1安装CUDA 1.1.1查看当前你的电脑显卡支持的最高CUD…

【微服务】springboot 实现动态修改接口返回值

目录 一、前言 二、动态修改接口返回结果实现方案总结 2.1 使用反射动态修改返回结果参数 2.1.1 认识反射 2.1.2 反射的作用 2.1.3 反射相关的类 2.1.4 反射实现接口参数动态修改实现思路 2.2 使用ControllerAdvice 注解动态修改返回结果参数​​​​​​​ 2.2.1 注解…

构造性神经组合优化的学习编码需要反悔

文章目录 Abstract1 Introduction2 Related Work用于构造性启发式的深度强化学习当前用于更好编码的方法3 LCH-Regret学习构造性启发式反悔机制LCH - Regret 机制的 L R L_R LR​Abstract 深度强化学习的神经组合优化中,学习构造性启发式(LCH)通过快速的自回归解构建过程实…

【ChromeDriver安装】爬虫必备

以下是安装和配置 chromedriver 的步骤&#xff1a; 1. 确认 Chrome 浏览器版本 打开 Chrome 浏览器&#xff0c;点击右上角的菜单按钮&#xff08;三个点&#xff09;&#xff0c;选择“帮助” > “关于 Google Chrome”。 2. 下载 Chromedriver 根据你的 Chrome 版本&…

原宝,四周年快乐!

原神&#xff0c;公测于2020年9月28日开启。 现在已经是第4个年头了&#xff0c;7个国家已经开放了6个&#xff0c;来到了火之国。其实自从2022年继续开放游戏版号以来&#xff0c;好品质的二次元游戏、三端游戏也是层出不穷。无论是立绘&#xff0c;建模都有非常优秀的作品。…

Profinet转Modbus485RTU网关同步采集高速响应无需编程轻松组网

Profinet转Modbus485RTU网关同步采集高速响应无需编程轻松组网https://item.taobao.com/item.htm?ftt&id778760672600PROFINET 串口网关 PROFINET 转 RS485 MS-A1-30X1 作为 Profinet 通信的通讯单元进行动作。可通过 Profinet 通信&#xff0c;将 MS-A1-30X1 单元的当前值…

04_OpenCV图片缩放

import cv2 import matplotlib.pyplot as plt # Python 的 2D绘图库# 读入原图片 img cv2.imread(libarary.JPG) # 打印出图片尺寸 print(img.shape) # 将图片高和宽分别赋值给x&#xff0c;y x, y img.shape[0:2]# 显示原图 #cv.imshow(OriginalPicture, img)# 缩放到原来的…

企业级版本管理工具(1)----Git

目录 1.Git是什么 2.Git的安装和使用 在Ubuntu下安装命令如下&#xff1a; 使用git --version查看已安装git的版本&#xff1a; 使用git init初始化仓库&#xff1a; 使用tree .git列出目录&#xff1a; 使用git config命令设置姓名和邮箱&#xff1a; 加入--global选项…

NLP:BERT的介绍

1. BERT 1.1 Transformer Transformer架构是一种基于自注意力机制(self-attention)的神经网络架构&#xff0c;它代替了以前流行的循环神经网络和长短期记忆网络&#xff0c;已经应用到多个自然语言处理方向。   Transformer架构由两个主要部分组成&#xff1a;编码器(Encod…

18年408数据结构

第一题&#xff1a; 解析&#xff1a;这道题很简单&#xff0c;按部就班的做就可以了。 画出S1&#xff0c;S2两个栈的情况&#xff1a; S1: S2: 2 3 - 8 * 5 从S1中依次弹出两个操作数2和3&a…

某客户Oracle RAC无法启动故障快速解决

某日&#xff0c;9:50左右接到好友协助需求&#xff0c;某个客户Oracle RAC无法启动&#xff0c;并发过来一个报错截图&#xff0c;如下&#xff1a; 和客户维护人员对接后&#xff0c;远程登录服务端进行故障分析。 查看hosts信息&#xff0c;首先进行心跳测试&#xff0c;测…

DIDIDI~

1 最佳速通时间 小C准备参加某个游戏的速通比赛&#xff0c;为此他对该游戏速通了 n次&#xff0c;每次速通记录可以用一个数组 A{a1,a2……am}表示&#xff0c;其中a表示小C 从游戏开始到第i个游戏节点所花赛的时间&#xff0c;m 为游戏节点的个数。请根据小 C 的速通记录计算…

椭圆距离计算的简单方法

分析发现找到点到椭圆的最近距离等价于求解一元四次方程。想象一下一个圆和一个椭圆最多相交四次。从这个观点出发,问题转化为找到与椭圆仅相交一次的圆。如果用四次方程表示,其中两个根将在交点处共享,而另外两个根将会是复数。 尽管四次方程的封闭解确实存在,但迭代方法更…

肌筋膜炎可以自愈吗

肌筋膜炎是一种临床常见的疾病&#xff0c;主要表现为肌肉的筋膜发生无菌性炎症&#xff0c;可能由多种因素诱发&#xff0c;如风寒侵袭、疲劳、外伤、不良生活习惯及工作姿势等。关于肌筋膜炎是否可以自愈&#xff0c;主要取决于病情的严重程度和个体差异。 一、肌筋膜炎的自…