当前位置: 首页 > news >正文

类与对象 中(剩余部分) 以及 日历

运算符重载

• 当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。
• 运算符重载是具有特名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。
• 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元
运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。
• 如果⼀个重载运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数⽐运算对象少⼀个。
• 运算符重载以后,其优先级和结合性与对应的内置类型运算符保持⼀致。
• 不能通过连接语法中没有的符号来创建新的操作符:⽐如operator@。
• .* :: sizeof ?: . 注意以上5个运算符不能重载。(选择题⾥⾯常考,⼤家要记⼀下)
• 重载操作符⾄少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义,如: int
operator+(int x, int y)
• ⼀个类需要重载哪些运算符,是看哪些运算符重载后有意义,⽐如Date类重载operator-就有意
义,但是重载operator+就没有意义。

• 重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,⽆法很好的区分。
C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。
• 重载<<和>>时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第⼀个形参位
置,第⼀个形参位置是左侧运算对象,调⽤时就变成了对象<<cout,不符合使⽤习惯和可读性。
重载为全局函数把ostream/istream放到第⼀个形参位置就可以了,第⼆个形参位置当类类型对
象。

取地址运算符重载

• 将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后⾯。
• const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进⾏修改。
const修饰Date类的Print成员函数,Print隐含的this指针由 Date* const this 变为 const Date* const this
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器⾃动⽣成的就可以够我们⽤了,不需要去显⽰实现。除⾮⼀些很特殊的场景,⽐如我们不想让别⼈取到当前类对象的地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址

日历代码

头文件
#pragma once
#include<assert.h>
#include<iostream>
using namespace std;
class Date
{friend ostream& operator<<(ostream& out, const Date& p);friend istream& operator>>(istream& in,Date& p);
public:Date(int year, int month, int day);void Print(void);bool CheckDate(){if (_month < 1 || _month>12 || _day<1 || _day > GetMonthDay(_year, _month)){return false;}else{return true;}}int GetMonthDay(int year, int month){assert(month > 0 && month < 13);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;}else{return monthDayArray[month];}}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);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);//void operator<<(ostream& out);int operator-(const Date& d);private:int _year;int _month;int _day;
};ostream& operator<<(ostream& out,const Date& p);
istream& operator>>(istream& in,Date& p);
功能代码
#define _CRT_SECURE_NO_WARNINGS
#include "Date.h"Date::Date(int year = 2000, int month = 1, int day = 1)
{_year = year;_month = month;_day = day;if (!CheckDate()){cout << "error" << endl;cout << *this;}
}void Date::Print()
{cout << _year << "-" << _month << "-" << _day << endl;
}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 !(*this >= d);
}bool Date::operator<=(const Date& d)
{return !(*this > d);
}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 _year == d._year && _month == d._month && _day == d._day;
}Date Date::operator+(int day)
{Date tmp = *this;tmp += day;return tmp;
}
Date& Date::operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){_year++;_month = 1;}}return (*this);
}Date& Date::operator-=(int day)
{_day -= day;while (_day <= 0){--_month;if (_month == 0){_month = 12;--_year;}_day += GetMonthDay(_year, _month);}return *this;
}
Date Date::operator-(int day)
{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)
{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;
}istream& operator>>(istream& in,Date& p)
{while(1){cout << "year month day";in >> p._year >> p._month >> p._day;if (p.CheckDate()){break;}else{cout << "error" << endl;}}return in;
}
ostream& operator<<(ostream& out,const Date& p)
{out << p._year << "年" <<p._month << "月" << p._day << endl;return out;
}

 


 

相关文章:

类与对象 中(剩余部分) 以及 日历

运算符重载 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 • 运算符重载是具有特名字的…...

iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14&#xff0c;基于 AVPictureInPictureController&#xff0c;实现自定义画中画&#xff0c;涵盖所有功能与难点。 市面上的各种悬浮钟和提词器的原理都是基于此。 Demo源码在文末。 使用 iOS 画中画的要求&#xff1a; 真机&#xff0c;不能使用模拟器&#xff1b;iO…...

【C#生态园】完整解读C#网络通信库:从基础到实战应用

探索C#网络通信库&#xff1a;功能、用途和最佳实践 前言 随着互联网的快速发展&#xff0c;网络通信在现代软件开发中扮演着至关重要的角色。C#作为一种流行的编程语言&#xff0c;拥有多个优秀的网络通信库&#xff0c;为开发人员提供了丰富的选择。本文将深入探讨几种常用…...

js面试题---事件委托是什么

事件委托是JavaScript中的一种事件处理模式&#xff0c;通过将事件处理程序绑定到父元素&#xff0c;而不是直接绑定到每个子元素&#xff0c;从而优化事件管理和提高性能。 1 工作原理 事件冒泡&#xff1a;当一个事件在某个元素上发生时&#xff0c;它会从该元素向上冒泡到…...

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…...

【记录】PPT|PPT 箭头相交怎么跨过

众所周知&#xff0c;在PPT中实现“跨线”效果并非直接可行&#xff0c;这一功能仅存在于Visio中。然而&#xff0c;通过一些巧妙的方法&#xff0c;我们可以在PPT中模拟出类似的效果。怎么在PPT中画交叉但不重叠的线-百度经验中介绍了一种方法&#xff0c;而本文将介绍一种改进…...

Linux中如何修改root密码

在 Linux 中&#xff0c;修改 root 用户密码可以通过以下步骤进行。你需要具有超级用户权限才能执行这些操作。 方法一&#xff1a;使用 passwd 命令修改 root 密码 使用具有超级用户权限的账户登录 如果你已经以 root 身份登录&#xff0c;或者你当前账户具备超级用户权限&am…...

中间件:SpringBoot集成Redis

一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xff09…...

数据中心建设方案,大数据平台建设,大数据信息安全管理(各类资料原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏…...

TDD(测试驱动开发)是否已死?

Rails 大神、创始人 David Heinemeier Hansson 曾发文抨击TDD。 TDD is dead. Long live testing. (DHH) 此后, Kent Beck、Martin Fowler、David Hansson 三人就这个观点还举行了系列对话&#xff08;辩论&#xff09; Is TDD Dead? 笔者作为一个多年在软件测试领域摸索的人&…...

Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic

Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic 一、认识TDengine二、TDengine Kafka Connector三、什么是 Kafka Connect?四、前置条件五、安装 TDengine Connector 插件六、启动 Kafka七、验证 kafka Connect 是否启动成功八、TDengine Source Connector 的使用…...

数据结构(一)顺序表

顺序表的概念及结构 线性表 线性表是具有相同特征的数据结构的集合 物理结构 不一定连续 逻辑结构 连续 顺序表 顺序表是线性表的一种&#xff0c;顺序表的底层是数组 物理结构 连续 逻辑结构 连续 顺序表分类 静态顺序表 struct SeqList {int a…...

如何在 Jupyter Notebook 执行和学习 SQL 语句(中)

1. 基础SQL操作 创建数据库和表&#xff0c;插入数据&#xff1a; import sqlite3# 创建SQLite数据库并连接 conn sqlite3.connect(example.db) cursor conn.cursor()# 创建用户表 cursor.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT…...

AutosarMCAL开发——基于EB Wdg驱动

目录 一、Wdg原理以及作用1.看门狗类型2.看门狗功能特点3.看门狗工作模式4.看门狗超时响应5.看门狗寄存器 二、WDG模块EB配置&#xff08;TC3X系列MCU&#xff09;1.WDG通用配置&#xff1a;2.WDG设置&#xff1a;3.时钟资源分配4.配置STM IRQ中断5.配置触发执行动作&#xff1…...

Linux(1. 基本操作_命令)

目录 关于超级用户root&#xff1a; root用户可以做什么&#xff1f; 避免灾难&#xff1a; 格式约定&#xff1a; 浏览硬盘&#xff1a; 命令行补全和通配符&#xff1a; 命令行补全&#xff1a; 通配符&#xff1a; 常用基本命令&#xff1a; 查看目录和文件&#xff…...

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…...

小米路由器刷机istoreOS,愉快上网

istoreOS与openwrt openwrt是一个开源的路由器系统,市场上所有小米路由器的内部系统都是基于openwrt进行二次开发形成的,做了硬件适配和功能上的阉割,不太好用。 istoreos是小宝团队基于openwrt制作的一个发行版,更适合中国宝宝体质。页面简约华丽,完全兼容开源openwrt的…...

微信小程序 - 01 - 一些补充和注意点(补充ing...)

目录 一、节流二、在一个发请求的函数中&#xff0c;只有发生下拉动作&#xff0c;才执行关闭下拉代码 最近在学微信小程序&#xff0c;把学习过程中的一些补充和注意点总结一下&#xff0c;内容会比较简单&#xff0c;因为只涉及基础知识&#xff0c;供个人参考 一、节流 情…...

微服务实战——登录(普通登录、社交登录、SSO单点登录)

登录 1.1. 用户密码 PostMapping("/login")public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session){R r memberFeignService.login(vo);if(r.getCode() 0){MemberRespVo data r.getData("data", new Type…...

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 ES比较耗内存&#xff0c;建议虚拟机4G或以上内存&#xff0c;jvm1g以上的内存分…...

Chrome扩展开发实战:打造浏览器侧边栏ChatGPT助手

1. 项目概述&#xff1a;一个让ChatGPT常驻浏览器侧边栏的利器如果你和我一样&#xff0c;每天的工作和学习都离不开浏览器&#xff0c;并且频繁地与ChatGPT对话来获取灵感、润色文案或者调试代码&#xff0c;那么你肯定对在无数个标签页之间来回切换感到厌烦。每次都要打开一个…...

Codesys ST语言PID调参避坑指南:从仿真到实战,手把手教你搞定温控/电机项目

Codesys ST语言PID调参避坑指南&#xff1a;从仿真到实战的工程化解决方案 在工业自动化领域&#xff0c;PID控制算法占据着核心地位。无论是恒温控制、电机调速还是压力调节&#xff0c;一个精心调校的PID控制器往往能决定整个系统的性能表现。然而&#xff0c;许多工程师在掌…...

从Scratch图形化到Python代码:用树莓派给LeArm机械臂做二次开发实战

从Scratch图形化到Python代码&#xff1a;用树莓派给LeArm机械臂做二次开发实战 当Scratch积木块拼接的机械臂动作开始显得单调时&#xff0c;便是时候揭开底层控制的神秘面纱了。本文将带您跨越图形化编程的舒适区&#xff0c;用树莓派的Python环境重新定义LeArm机械臂的智能—…...

别再死记硬背了!用Python模拟超前进位加法器,直观理解其速度优势

用Python模拟超前进位加法器&#xff1a;从硬件原理到算法思维的跨越 在计算机科学和电子工程交叉领域&#xff0c;加法器是最基础却又最精妙的设计之一。传统教学中&#xff0c;我们往往通过抽象的电路图来理解超前进位加法器&#xff08;CLA&#xff09;的速度优势&#xff0…...

避坑指南:Unity热重载插件内存占用高?可能是Windows Defender在搞鬼

Unity热重载性能优化&#xff1a;解决Windows Defender导致的资源占用问题 当你在Unity开发过程中频繁修改C#代码时&#xff0c;热重载(Hot Reload)功能无疑是提升效率的利器。它能让你在游戏运行状态下即时看到代码修改效果&#xff0c;避免反复重启带来的时间浪费。然而&…...

高效跨平台游戏模组下载:WorkshopDL完全指南

高效跨平台游戏模组下载&#xff1a;WorkshopDL完全指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在Epic Games Store、GOG或其他非Steam平台购买了游戏&#xff0…...

别再点‘忽略’了!开机弹出Visual C++ Runtime Library错误的终极排查指南(附Adobe软件关联排查)

Visual C Runtime Library错误&#xff1a;从崩溃到根治的全链路解决方案 每次开机时那个刺眼的Visual C Runtime Library错误弹窗&#xff0c;就像一位不请自来的访客&#xff0c;固执地打断你的工作节奏。对于依赖Adobe Creative Cloud或达芬奇等创意工具的专业人士来说&…...

猫抓插件:5分钟掌握浏览器资源嗅探的终极武器

猫抓插件&#xff1a;5分钟掌握浏览器资源嗅探的终极武器 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容无处不在的今天&#xff0c;你…...

树莓派机械爪项目实战:从硬件连接到Python控制全解析

1. 项目概述&#xff1a;当树莓派遇上机械爪最近在折腾一个挺有意思的小项目&#xff0c;叫Demwunz/openclaw-pi-installation。光看这个名字&#xff0c;就能猜到个大概&#xff1a;这是一个为树莓派&#xff08;Raspberry Pi&#xff09;准备的机械爪&#xff08;Claw&#x…...

MQ-3与MiCS-5524气体传感器对比:从原理到实战的选型指南

1. 项目概述与核心价值在嵌入式开发、环境监测乃至一些创意DIY项目中&#xff0c;气体检测是一个常见且关键的需求。无论是为了安全预警&#xff08;如天然气泄漏&#xff09;&#xff0c;还是进行环境质量评估&#xff08;如VOC监测&#xff09;&#xff0c;选择一款合适的传感…...