类和对象(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攻击、扫描和各种形式的安全威胁。然而,对于合法的游戏运营商而言,有时需要对服务器进行维护或调试,…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
循环语句之while
While语句包括一个循环条件和一段代码块,只要条件为真,就不断 循环执行代码块。 1 2 3 while (条件) { 语句 ; } var i 0; while (i < 100) {console.log(i 当前为: i); i i 1; } 下面的例子是一个无限循环,因…...
