C++初阶--类与对象--const成员和日期类的实现

news2024/12/28 19:59:23

文章目录

  • const 成员
  • 对一个日期类的实现
    • 源码
    • 解析
      • 构造函数的验证
      • 运算符的重复利用
      • 前置++与后置++
      • 其他运算符的验证

const 成员

将const修饰的成员函数称之为const成员函数。
在一个成员函数里面,对于this指针指向的对象,是隐藏式的,没有办法用常规的方法去修饰它,所以我们是这样进行修饰的:
在这里插入图片描述

注意事项:
在这里插入图片描述

对一个日期类的实现

源码

date.h

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	Date(int year=1 , int month=1 , int day=1 );
	Date(const Date& d);

	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;
	bool operator>(const Date& d)const;
	bool operator<(const Date& d)const;
	bool operator==(const Date& d)const;
	bool operator>=(const Date& d)const;
	bool operator<=(const Date& d)const;
	void Print()const;
	int GetMonthDay()const;


};

date.cpp

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Date.h"

Date::Date(int year,int month,int day)
{
	_year = year;
	_month = month;
	_day = day;

	if (_year<1 || _month < 1 || _month>12 || _day>GetMonthDay())
	{
		Print();
		cout << "日期非法" << endl;

	}
}
Date::Date(const Date& d)
{
	_year = d._year;
	_month = d._month;
	_day = d._day;
}

void Date::Print()const
{
	cout << _year << "-" << _month << "-" << _day << endl;
}
int Date::GetMonthDay()const
{
	assert(_year >= 1 && _month >= 1 && _month<=12);
	int day=0;
	day+= _day;
	int Array[] = { 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;
	}
	return Array[_month];
}

//d1+=50;
Date& Date::operator+=(int day)
{
	if (day < 0)
	{
		return *this -= (-day);
	}
	_day += day;
	while (_day > GetMonthDay())
	{
		_day -= GetMonthDay();
		_month++;
		if (_month > 12)
		{
			_month = 1;
			_year++;
		}
	}
	return (*this);
}
//d2=d1+100
Date Date::operator+(int day)const
{
	Date tmp(*this);
	tmp += day;
	return tmp;
}

//d1-=100
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();
	}
	return (*this);
}
//d1=d2-100
//日期-天数
Date Date::operator-(int day)const
{
	Date tmp(*this);
	tmp -= day;
	return tmp;
}

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

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

bool Date::operator>(const Date& d)const
{
	if (_year < d._year)
	{
		return false;
	}
	if (_year == d._year && _month < d._month)
	{
		return false;
	}
	if (_year == d._year && _month == d._month && _day < d._day)
	{
		return false;
	}
	return true;
}
bool Date::operator==(const Date& d)const
{
	if (_year == d._year && _month == d._month && _day == d._day)
	{
		return true;
	}
	return false;
}
bool Date::operator>=(const Date& d)const
{
	return *this > d || *this == d;
}

bool Date::operator<(const Date& d)const
{
	return !(*this>d || *this==d);
}

bool Date::operator<=(const Date& d)const
{
	return *this < d || *this == d;
}

int Date::operator-(const Date& d)const
{
	int day = 0;
	Date min = *this;
	Date max = d;
	if (*this>d)
	{
		min = d;
		max = *this;
	}
	while (min < max)
	{
		min++;
		day++;
	}
	return day;

}

解析

这里采用多文件编程的方式,所以在date.cpp中,是在Date类外使用的,需要加上作用域限定符;
对于不改变类对象,也就是this指针指向的对象的,尽量都加上const进行修饰,有一定程度提高效率;
在date.h中,不管成员变量还是成员函数,在类中都只是起到声明的作用,类的成员变量的定义将会在对象中进行定义,类的成员函数都是在date.cpp定义的

构造函数的验证

在这里插入图片描述

在我们定义时,我们已经加上了缺省值了,
在这里插入图片描述
所以在定义时就不用加上缺省值了,加上反而非产生冲突,使编译器无法辨别要哪个缺省值,产生矛盾;

在定义时我们加上了对日期是否合法进行了判断,但没有强制性退出,只是打印警告;

我们将给出三组数据进行验证:
在这里插入图片描述

运算符的重复利用

对于重复的步骤,我们可以运用另一个函数来进行完成:
在这里插入图片描述
而这里也是有一定讲究的,对于参数和返回值来说,都会创建一个临时变量对象来拷贝传参的值,而这就表示着要调用拷贝构造函数,所以我们在写程序时,要尽量的少调用函数,提高一定的效率

上述程序中,调用函数次数:
在这里插入图片描述
如果我们反过来写的话:
!](https://img-blog.csdnimg.cn/eac3af7c12554ba0b67aef2d8c27db9a.png)

注意:对于+=来说,会改变this指针指向对象的值,所以这里不能使用const来进行修饰;
而+ 到最后会返回一个值给对应的对象,这个对象不是this指针所指向的对象的,所以可以使用const进行修饰;

在这里插入图片描述
我们在date.cpp中没有写明=的重载,类会生成一个默认的运算符重载;
在这里插入图片描述

前置++与后置++

在C++中,前置++的重载形式与后置++的重载形式是相同的,为了辨别这两种重载形式,后置++重载时在参数中多加一个int类型的参数,但调用函数时该参数是不参与传递的。

在这里插入图片描述

前置++就是直接+=1;而后置++会等到语句结束后才加上1,所以先找一个中间值tmp来进行代替,表示还没有+1;

其他运算符的验证

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

B-DS二叉树_输出所有目标路径

Description 给定二叉树和一个整数目标targetSum&#xff0c;输出所有从根结点到叶子结点的路径总和等于targetSun的路径。 Input 第一行输入t&#xff0c;表示有t个测试样例。 第二行起&#xff0c;每一行首先输入一个整数targetSum&#xff0c;接着输入n&#xff0c;接着输…

带你拿捏链表

本专栏内容为&#xff1a;数据结构学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握数据结构。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数据结构 &#x1f69a;代码仓库&#xff1a;小小u…

Mega Sales购物季营销,掌握流量密码不是事

“Mega Sales”购物季是东南亚地区“双十一、双十二”的两个重要节点&#xff0c;在年末即将来临之际&#xff0c;全球电商市场都正进入激动人心的备货大卖时期。面对这样的重要节目&#xff0c;商家应该如何做好营销铺垫&#xff0c;全面备战大促的不同阶段&#xff1f; 作为…

C生万物 | 从浅入深理解指针【第三部分】(qsort的使用和模拟实现)

C生万物 | 从浅入深理解指针【第四部分】&#xff08;qsort的使用和模拟实现&#xff09; 文章目录 C生万物 | 从浅入深理解指针【第四部分】&#xff08;qsort的使用和模拟实现&#xff09;回调函数是什么&#xff1f;qsort使用举例qsort函数的模拟实现 回调函数是什么&#x…

网络层:控制平面

路由选择算法 路由选择算法就是为了在端到端的数据传输中&#xff0c;选择路径上路由器的最好的路径。通常&#xff0c;一条好的路径指具有最低开销的路径。最低开销路径是指源和目的地之间具有最低开销的一条路。 根据集中式还是分散式来划分 集中式路由选择算法&#xff1a…

从UEFI如何启动到系统

从UEFI如何启动到系统 文章目录 从UEFI如何启动到系统UEFI须知1. 进入UEFI setup界面2. Setup界面3. BootManager界面4. Shell下操作4.1. 显示启动设备4.2. 进入设备及查看文件4.3. UEFI下的其他操作4.4. UEFI下的一些Shell命令 5. UEFI下更新固件方法GRUBGRUB界面1. 编辑GRUB选…

为什么搭建自己的帮助中心很重要?

在当今数字化和信息爆炸的时代&#xff0c;用户对产品和服务的期望越来越高。他们希望能够快速找到解决问题的方法和答案&#xff0c;而不是在不尽其穷的文档和论坛中浪费时间。在这样的背景下&#xff0c;建立一个完善的帮助中心成为了企业提供优质客户支持的关键。帮助中心不…

VSCode 连接不上 debian 的问题

之前一台笔记本上安装了 debian12&#xff0c;当时用 vscode 是可以连接上的&#xff0c;但今天连接突然就失败了&#xff0c;失败信息是这样的&#xff1a; 查看失败信息 因为 debian 是自动获取 ip 地址的&#xff0c;以前能连接上时&#xff0c;ip 地址是 104&#xff0c;然…

【免费生产力工具】CodeGeeX: AI代码自动补齐、对话、自动注释

CodeGeeX - A Multilingual Code Generation Tool - CodeGeeX 这个是官网&#xff0c;工程好像是开源的&#xff0c;生态不错。清华校友确实强&#xff0c;我是菜菜。 我是在vscode里面装的插件&#xff0c;直接搜索就行。 多的就不bb了&#xff0c;大家试试吧&#xff0c;确…

[强网杯 2019]随便注1

打开题目 输入1 输入1&#xff0c;页面报错&#xff0c;输入1 #页面正常 说明1为注入点且注入方式为字符型的单引号注入 判断列名 输入 1 order by 2 # 页面正常 1 order by 3 #页面报错 说明列名字段数为2 接下来我们尝试用联合注入的方式爆出数据显示位 输入1 union s…

Java生成word文档

一 前言 Java编程生成word文档这种操作一般是常规操作比较常见&#xff0c;主要采用Apache的POI Word 这个库操作的比较多&#xff0c;还有的用Spire.Doc&#xff0c;但是这个库有些稍微难点的功能要收费&#xff0c;看了下费用还不低&#xff0c;周末朋友问起是否有用java操作…

Linux - 守护进程的概念

Linux下的守护进程是在后台运行的特殊进程&#xff0c;它不与任何终端关联&#xff0c;通常在系统启动时自动启动&#xff0c;运行在后台并且不受用户登录或注销的影响。Linux 下的守护进程通常是以系统管理员的权限运行&#xff0c;用来执行一些系统任务&#xff0c;例如监控硬…

【RabbitMQ】RabbitMQ 集群的搭建 —— 基于 Docker 搭建 RabbitMQ 的普通集群,镜像集群以及仲裁队列

文章目录 一、集群分类1.1 普通模式1.2 镜像模式1.3 仲裁队列 二、普通集群2.1 目标集群2.2 获取 Erlang Cookie2.3 集群配置2.4 启动集群2.5 测试集群 三、镜像模式3.1 镜像模式的特征3.2 镜像模式的配置3.2.1 exactly 模式3.2.2 all 模式3.2.3 nodes 模式 3.3 测试镜像模式 四…

北大软微2024推免拟录取名单及分析

拟录取名单 直博生 硕士生 分析 北大软微在2023年的推免中共录取直博生17人&#xff0c;硕士生205人&#xff0c;其中硕士生全为专硕电子信息 当然&#xff0c;从录取结果咱们可以看出来&#xff0c;除了985和强势211&#xff0c;中国地质&#xff08;北京&#xf…

基于人工大猩猩部队算法的无人机航迹规划-附代码

基于人工大猩猩部队算法的无人机航迹规划 文章目录 基于人工大猩猩部队算法的无人机航迹规划1.人工大猩猩部队搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用人工大猩猩部队算法…

解决:GnuTLS recv error (-110): The TLS connection was non-properly terminated.

fatal: 无法访问 https://github.com/facebookresearch/fvcore/&#xff1a;GnuTLS recv error (-110): The TLS connection was non-properly terminated. error: subprocess-exited-with-error 关闭梯子&#xff0c;再试一次就好了

web前端——HTML+CSS实现奥运五环

web前端——HTMLCSS实现奥运五环 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

【Vue基础-实践】数据可视化大屏设计(林月明螺蛳粉文化公司单量数据大屏)

目录 一、知识整理 1、页面自适应 2、下载插件px to rem & rpx 3、关于padding与margin 4、下载echarts 5、下载axios 6、experss官网接口创建 7、创建路由 8、api接口创建 9、设置基准路径 10、跨域设置 11、图表设置 12、地图数据引用 13、设置地图效果 二、…

【MySQL】数据库MySQL基础知识与操作

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

聊一聊关于手机Charge IC的电流流向

关于手机Charge&#xff0c;小白在以前的文章很少讲&#xff0c;一是这部分东西太多&#xff0c;过于复杂。二是总感觉写起来欠缺点什么。但后来想一想&#xff0c;本是抱着互相学习来写文章的心理态度&#xff0c;还是决定尝试写一些。 关于今天要讲的关于手机Charge的内容&a…