类和对象(2
*续上文中的运算符重载
4 重载++运算符时,有前置和后置的++,运算符重载的函数名都是operator++, 无法很好区分
所以c++规定,后置++重载时,增加一个int形参 与前置++做区分
5 重载<<和>>时需要重载为全局函数, 因为重载为成员函数时, this指针默认抢占了第一个形参位, 第一个形参位是左侧运算对象,
调用时变成了对象<<cout不符合使用习惯和可读性
重载为全局函数吧ostream\istream 放在第一个形参位就可以了,此时第二个形参位就是当前类的类对象
取地址运算符重载
const成员函数
将const修饰的成员函数称之为 const成员函数,const修饰成员函数放到成员函数参数列表的后面
const实际修饰该陈元函数隐含的this指针, 表面在该成员函数中不能对类的任何成员进行修改
const修饰Data类的print成员函数,printf隐含的指针由data* const this 变为const data* const this
取地址运算符重载(一般情况用不上)
取地址运算符重载分为普通…和const…,一般这两个函数编译器自动生成就够用了
不需要显示实现 存放也特殊场景
比如我们不想让别人取到当前类对象的地址,就可以自己实现一份 随便返回一个地址
日期类的实现
data.h
#pragma once
#include <iostream>
using namespace std;
#include <assert.h>class Data
{//友元声明 可以让类外的函数访问类中的私域//流插入friend ostream& operator<<(ostream& out, const Data& d);//流提取friend istream& operator>>(istream& in, Data& d);//d不能加const因为需要改变
public:Data(int year = 1999, int month = 1, int day = 1);void Print() const;//查看日期是否违法bool CheckData() const;//求每月对应天数int MonthDays(int year, int month) const{assert(month > 0 && month < 13);static int days[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;}return days[month];}Data& operator+=(int day);Data operator+(int day) const;Data& operator-=(int day);Data operator-(int day) const;bool operator<(const Data& d) const;bool operator<=(const Data& d) const;bool operator>(const Data& d) const;bool operator>=(const Data& d) const;bool operator==(const Data& d) const;bool operator!=(const Data& d) const;//++d1(前置++同的较多)Data& operator++();//d1++Data operator++(int);//--d1Data& operator--();//d1--Data operator--(int);int operator-(const Data& d) const;private:int _year;int _month;int _day;
};
//流插入(从左往右插入) 定义为全局函数
ostream& operator<<(ostream& out,const Data& d);
//流提取
istream& operator>>(istream& in, Data& d);
data.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"data.h"
bool Data::CheckData() const
{if (_month < 1 || _month>12|| _day<1 || _day>MonthDays(_year, _month)){return false;}else{return true;}
}
Data::Data(int year, int month, int day)
{_year = year;_month = month;_day = day;if (!CheckData()){cout << "非法日期";Print();}}
void Data::Print() const
{cout << _year << '/' << _month << '/' << _day << endl;
}Data& Data::operator+=(int day)
{if (day < 0){return *this -= - day;}_day += day;while (_day > MonthDays(_year, _month)){_day -= MonthDays(_year, _month);_month++;if (_month == 13){_year++;_month = 1;}}return *this;
}Data Data::operator+(int day) const{Data tmp = *this;tmp += day;return tmp;}Data& Data::operator-=(int day){_day -= day;while (_day <=0 ){--_month;if (_month == 0){_year--;_month = 12;}_day += MonthDays(_year, _month);}return *this;}
Data Data::operator-(int day) const
{Data tmp = *this;tmp -= day;return tmp;
}//也可以实现 +\- 去附用+=\-= 不过效率更低bool Data::operator<(const Data& d) const
{if (_year < d._year){return true;}else if (_year ==d._year){if (_month < d._month){return true;}else if (_month == d._month){return _day < d._day;}}return false;
}
bool Data::operator<=(const Data& d) const
{return *this < d|| *this == d;
}
bool Data::operator>(const Data& d) const
{return !(*this <= d);
}
bool Data::operator>=(const Data& d) const
{return !(*this < d);}
bool Data::operator==(const Data& d) const
{return _year == d._year&& _month == d._month&& _day == d._day;
}
bool Data::operator!=(const Data& d) const
{return !(*this == d);
}//++d1(前置++同的较多)
Data& Data::operator++()
{*this += 1;return *this;
}
//d1++
Data Data::operator++(int)
{Data tmp = *this;*this += 1;return tmp;
}//--d1
Data& Data::operator--()
{*this -= 1;return *this;
}
//d1--
Data Data::operator--(int)
{Data tmp = *this;*this -= 1;return tmp;
}int Data::operator-(const Data& d) const
{int flag = 1;Data max = *this;Data min = d;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 Data& d)
{out << d._year << "年" << d._month << "月" << d._day << "日" << endl;return out;
}
//流提取
istream& operator>>(istream& in, Data& d)
{while (1){cout << "请输入对应的年月日:";in >> d._year >> d._month >> d._day;if (!d.CheckData()){cout << "日期非法,请重新输入日期:"<<endl;d.Print();cout<<endl;}}return in;
}
相关文章:
类和对象(2
*续上文中的运算符重载 4 重载运算符时,有前置和后置的,运算符重载的函数名都是operator, 无法很好区分 所以c规定,后置重载时,增加一个int形参 与前置做区分 5 重载<<和>>时需要重载为全局函数, 因为重载为成员函数时, this指针默认抢占了第一个形参位, 第一个形参…...
AcWing 668. 游戏时间2
读取四个整数 A,B,C,D𝐴,𝐵,𝐶,𝐷,用来表示游戏的开始时间和结束时间。 其中 A𝐴 和 B𝐵 为开始时刻的小时和分钟数,C𝐶 和 D𝐷 为结束时刻的小时和分钟数。…...
AI发展下的伦理挑战,应当如何应对?
针对人工智能(AI)发展中面临的伦理挑战,构建一个全面、有效的治理体系至关重要。以下是对三大关键方向——隐私保护、算法公正与透明度、深度伪造管控——的深入探讨与具体实践方案: 方向一:构建可靠的AI隐私保护机制…...
Java面试题--JVM大厂篇之深入解析JVM中的Serial GC:工作原理与代际区别
目录 引言: 正文: 一、Serial GC工作原理 年轻代垃圾回收(Minor GC): 老年代垃圾回收(Major GC或Full GC): 二、年轻代和老年代的区别 年轻代(Young Generation&a…...
网络安全高级工具软件100套
1、 Nessus:最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上。它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance–终端用户授权协议)。 它…...
Ubuntu 添加gcc头文件搜索路径
对个人用户生效 sudo vim ~/.bashrc在该文件末尾添加 #gcc C_INCLUDE_PATH$C_INCLUDE_PATH:your_path export C_INCLUDE_PATH #g CPLUS_INCLUDE_PATH$CPLUS_INCLUDE_PATH:your_path export CPLUS_INCLUDE_PATH最后,重启终端即可生效 可用以下命令查看搜索路径 ec…...
c++写数据结构进入文件
以下定义一个数据结构 struct SData {std::string url;int number;std::string memo; };写入文件 void StorageDataToFile(const std::string& filename, const SData& data) {std::ofstream outFile(filename);if (outFile.is_open()) {// 使用std::stringstream格式…...
Java实验4
实验内容 考试题 要求在一个界面内至少显示5道选择题,每道题4个选项。题目从数据库读取。表结构自定义。 另有2个命令按钮,分别为“重新答题”(全部选项及正确答题数清空)和“提交”(计算),在…...
优化 Java 数据结构选择与使用,提升程序性能与可维护性
优化 Java 数据结构选择与使用,提升程序性能与可维护性 引言 在软件开发中,数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java 作为一门广泛使用的编程语言,提供了丰富的内置数据结构,如数组、链表、…...
华为USG6000V防火墙安全策略用户认证
目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1🤣防火墙FW1web服务配置 2.网络配置 要求1:DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 要求2:生产区不…...
Windows 应急响应手册v1.2 -百度网盘下载
家好,《Windows 应急响应手册 v1.2》 发布啦! 本次是一个大更新,解决了两个大问题,添加了4个大的事件处置流程以及一些更新,下载链接在文末 两个大问题是: Windows 平台的 Adobe acrobat DC 、Firefox 浏…...
Billu_b0x靶机
信息收集 使用arp-scan 生成网络接口地址来查看ip 输入命令: arp-scan -l 可以查看到我们的目标ip为192.168.187.153 nmap扫描端口开放 输入命令: nmap -min-rate 10000 -p- 192.168.187.153 可以看到开放2个端口 nmap扫描端口信息 输入命令&…...
GitHub+Picgo图片上传
Picgo下载,修改安装路径,其他一路下一步! 地址 注册GitHub,注册过程不详细展开,不会的百度一下 地址 新建GitHub仓库存放图片 ——————————————————————————————————————————…...
springboot的事务管理
在yml配置文件中添加以下:logging.level.org.springframework.jdbc.support.JdbcTransactionManagerdebug...
深入解析rsync:定义、架构、原理、应用场景及实战指南
前言 在现代数据管理和传输过程中,数据同步工具起着至关重要的作用。特别是在需要高效、可靠地在不同服务器或设备之间传输大量数据时,选择一款优秀的数据同步工具显得尤为重要。在众多工具中,rsync以其高效、灵活、可靠的特点,成…...
discuz手机版发帖提示“网络出现问题,请稍后再试”
大家好,我是网创有方。今天分享一个discuz发帖报错的问题。 问题描述:discuz手机网页端发帖提示“网络出现问题,请稍后再试”,但是实际上帖子已经发布成功。 本次记录下分析过程: 第一步:打开宝塔&#…...
图片如何去水印,PS 图片去水印的几种常见方法
在数字图像的世界里,水印常常被用来标识版权或防止未经授权的使用,但有时它们却成为了美观的障碍。无论是出于个人偏好还是专业需求,去除图片上的水印已经成为一项常见的任务。 Adobe Photoshop 作为行业标准的图像编辑软件,提供…...
【从零开始实现stm32无刷电机FOC】【实践】【5/6 stm32 adc外设的高级用法】
目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知,电机力矩来自于转子的q轴受磁力,而磁场强度与电流成正比,也就是说电机力矩与q轴电流成正相关,控制了…...
2407-mysql笔记
数据库(Database),简称db mariadbmysql 常见的数据库:mysql、oracle、高斯(Gauss)、redis、sqlserver、SQLite、HBase 一、SQL(Structured Query Language):结构化查询语言 1、作用ÿ…...
如何解决隐藏游戏服务器的源IP问题
在网络游戏领域,保护服务器的源IP地址不被轻易发现是一项重要的安全措施。游戏服务器的源IP一旦暴露,可能会遭受DDoS攻击、扫描和各种形式的安全威胁。然而,对于合法的游戏运营商而言,有时需要对服务器进行维护或调试,…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
