C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)

embedded/2024/12/22 13:30:04/

目录

1.前置++和后置++重载

2.const成员

3.日期类的实现


1.前置++和后置++重载

#include<iostream>
using namespace std;class Date
{
public:Date(int year = 2024, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//前置++:返回+1之后的结果//注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率Date& operator++(){_day += 1;return *this;}//后置++://前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确的重载//C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递//注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在是实现时需要先将this保存一份//,然后给this+1//而temp是临时对象,因此只能以值的方式返回,不能返回引用Date operator++(int){Date temp = *this;_day += 1;return temp;}
private:int _year;int _month;int _day;
};int main()
{Date d;Date d1(2022, 1, 13);d = d1++;//d:2022,1,13   d1:2022,1,14d = ++d1;//d:2022,1,15   d1:2022,1,15return 0;
}

2.const成员

将const修饰的”成员函数“称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

在日期类的实现里面具体应用

3.日期类的实现

//Date.h
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;class Date
{   //友元friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);public://全缺省构造函数Date(int year = 1, int month = 1, int day = 1);void Print()const{cout << _year << "-" << _month << "-" << _day << endl;}//拷贝构造函数Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}//运算符重载bool operator<(const Date& x)const;bool operator==(const Date& x)const;bool operator<=(const Date& x)const;bool operator>(const Date& x)const;bool operator>=(const Date& x)const;bool operator!=(const Date& x)const;//获取某年某月的天数int GetMonthDay(int year, int month);//日期+=天数Date& operator+=(int day);//日期+天数Date operator+(int day)const;//日期-=天数Date& operator-=(int day);//日期-天数Date operator-(int day)const;//前置++Date& operator++();//后置++Date operator++(int);//前置--Date& operator--();//后置--Date operator--(int);//日期-日期 返回天数int operator-(const Date& d)const;//流插入不能写成成员函数?//因为Date对象默认占用第一个参数,就是做了左操作数//写出来就一定是下面这个样子,不符合使用习惯//d1 << cout;  //d1.operator<<(cout);//void operator<<(ostream& out);private:int _year;int _month;int _day;
};ostream& operator<<(ostream& out, const Date& d);
istream& operator>>(istream& in, Date& d);//Date.cpp
#include"Date.h"
Date::Date(int year, int month, int day)
{if (month > 0 && month < 13&& day > 0 && day<=GetMonthDay(year,month)){_year = year;_month = month;_day = day;}else{cout << "非法日期" << endl;assert(false);}
}
bool Date::operator<(const Date& x)const
{if (_year < x._year){return true;}else if (_year == x._year && _month < x._month){return true;}else if (_year == x._year && _month == x._month && _day < x._day){return true;}return false;
}bool Date::operator==(const Date& x)const
{return _year == x._year&& _month == x._month&& _day == x._day;
}
bool Date::operator<=(const Date& x)const
{return *this < x || *this == x;
}bool Date::operator>(const Date& x)const
{return !(*this <= x);
}bool Date::operator>=(const Date& x)const
{return !(*this < x);
}bool Date::operator!=(const Date& x)const
{return !(*this == x);
}int Date::GetMonthDay(int year, int month)
{static int daysArr[13] = { 0,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;}else{return daysArr[month];}
}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){_month = 1;++_year;}}return *this;
}Date Date::operator+(int day)const
{Date tmp(*this);tmp += day;return tmp;
}Date& Date::operator-=(int day)
{if (day < 0){return *this += _day;}_day -= day;while (_day <= 0){--_month;if (_month == 0){_month = 12;--_year;}_day += GetMonthDay(_year, _month);}return *this;
}Date Date::operator-(int day)const
{Date tmp = *this;tmp -= day;return tmp;
}Date& Date::operator++()
{*this += 1;return *this;
}Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}Date& Date::operator--()
{*this -= 1;return *this;
}
Date Date::operator--(int)
{Date tmp = *this;*this -= -1;return tmp;
}int Date::operator-(const Date& d)const
{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;
}ostream& operator<<(ostream& out, const Date& d)
{out << d._year << "年" << d._month << "月" << d._day << "日" << endl;return out;
}istream& operator>>(istream& in, Date& d)
{int year, month, day;in >> year >> month >> day;if (month > 0 && month < 13&& day>0 && day <= d.GetMonthDay(year, month)){d._year = year;d._month = month;d._day = day;}else{cout << "非法日期" << endl;assert(false);}return in;
}


http://www.ppmy.cn/embedded/147831.html

相关文章

sqlite基础

在 SQLite 中&#xff0c;可以使用 CREATE INDEX 语句为表中的字段添加索引&#xff0c;以加速查询操作。 1. 为单个字段添加索引 假设有一个表 users&#xff0c;并且你想为 email 字段创建索引&#xff1a; CREATE INDEX idx_users_email ON users(email);这条语句会为 us…

go-zero(十四)实践:缓存一致性保证、缓存击穿、缓存穿透与缓存雪崩解决方案

go zero 实践&#xff1a;缓存一致性保证、缓存击穿、缓存穿透与缓存雪崩解决方案 缓存 作为一种重要的技术手段&#xff0c;可以有效提高系统的响应速度&#xff0c;降低对数据库的压力。但是缓存的使用伴随一些常见问题&#xff0c;如缓存一致性、缓存击穿、缓存穿透和缓存雪…

【hackmyvm】Diophante 靶场

1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. knock 3. WordPress利用3.1. wpscan扫描3.2. smtp上传后门 4. 提权4.1. 提权leonard用户4.2. LD劫持提权root 靶机链接 https://hackmyvm.eu/machines/machine.php?vmDiophante 作者…

数据分析实战—鸢尾花数据分类

1.实战内容 (1) 加载鸢尾花数据集(iris.txt)并存到iris_df中,使用seaborn.lmplot寻找class&#xff08;种类&#xff09;项中的异常值&#xff0c;其他异常值也同时处理 。 import pandas as pd from sklearn.datasets import load_iris pd.set_option(display.max_columns, N…

UDP系统控制器_音量控制、电脑关机、文件打开、PPT演示、任务栏自动隐藏

UDP系统控制器(ShuiYX) 帮助文档 概述 本程序设计用于通过UDP协议接收指令来远程控制计算机的音量、执行特定命令和其他功能。为了确保程序正常工作&#xff0c;请确认防火墙和网络设置允许UDP通信&#xff0c;并且程序启动后会最小化到托盘图标。 命令格式及说明 音量控制…

Apache POI

2.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。 Apache POI 的应用场景: 银行网银系统导出交易明细 各种业…

无人机航测VS传统测绘

无人机航测系统的优点 机动灵活&#xff0c;作业周期短&#xff1a; 无人机航测系统能够迅速响应测绘需求&#xff0c;不受地形和交通限制&#xff0c;可以灵活调整航线&#xff0c;作业周期短。 无人机体积小&#xff0c;噪音小&#xff0c;可以垂直起降、悬停、侧飞、倒飞…

Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用

图形数据库Neo4j在Linux系统ARM架构下的安装使用 1.说明2.下载安装并配置3.其他配置4.创建一个实例5.最后 Neo4J 无论是在官网或者其他镜像网站上都是只有两个版本 Linux和 Windows不区分 X86 和 ARM&#xff0c;原因是 Neo4j 运行在 JVM 上&#xff0c;只要 JVM 能够正常使…