《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符?

通过重载运算符,可以将复杂的操作封装成简单的运算符形式,简化代码,提高可读性下面举一个简单的例子

计算两个点的坐标之和。

1.不重载运算符

#include <iostream>  
using namespace std; class Point { 
public:int x, y;  // Point类的成员变量,表示点的x和y坐标// 构造函数,初始化x和y坐标Point(int x, int y) : x(x), y(y) {}// 成员函数,用于计算两个点的坐标之和并返回新的Point对象Point add(const Point& other) const {return Point(x + other.x, y + other.y);  // 返回一个新Point,其坐标为当前对象和other对象坐标的和}
};int main() {Point p1(1, 2);  // 创建一个Point对象p1,坐标为(1, 2)Point p2(3, 4);  // 创建另一个Point对象p2,坐标为(3, 4)// 使用成员函数add来计算两个点的坐标之和,并将结果赋值给p3Point p3 = p1.add(p2);// 使用cout输出p3的坐标,格式为"(x, y)"cout << "The sum of p1 and p2 is: (" << p3.x << ", " << p3.y << ")" << endl;system("pause");return 0; 
}

2.使用重载运算符

#include <iostream> 
using namespace std; class Point { 
public:int x, y; // 构造函数,用于初始化点的x和y坐标Point(int x, int y) : x(x), y(y) {}// 重载 "+" 运算符,使其能够用于Point类的对象// 这个函数接受一个Point对象作为参数,并返回一个新的Point对象// 新对象的坐标是原两个Point对象坐标的和Point operator+(const Point& other) const {return Point(x + other.x, y + other.y); // 返回一个新的Point对象,其坐标为当前对象和other对象坐标的和}
};int main() {Point p1(1, 2);  // 创建一个Point对象p1,其坐标为(1, 2)Point p2(3, 4);  // 创建另一个Point对象p2,其坐标为(3, 4)// 使用重载的 "+" 运算符来计算两个Point对象的坐标之和// 这行代码等价于调用 p1.add(p2),但由于运算符重载,我们可以直接使用 + 号Point p3 = p1 + p2;cout << "The sum of p1 and p2 is: (" << p3.x << ", " << p3.y << ")" << endl;system("pause");return 0; 
}

重载运算符后可以使用+来进行坐标点的运算,代码更加简洁,可读性更高

2.单目运算符

即只能对一个操作数进行操作

单目运算符的类型
在这里插入图片描述
单目递增与单目递减运算符
一个可以对日期进行递增和递减的操作,代码如下:

#include <iostream>
using namespace std;class Date {
private:int day;int month;int year;// 简化版的日期合法性检查void checkDate() {// 如果是2月28日,增加到3月1日if (month == 2 && day == 29) {day = 1;month = 3;}// 如果月份超过12,增加年份if (month > 12) {month = 1;year++;}}public:// 构造函数Date(int d, int m, int y) : day(d), month(m), year(y) {checkDate();}// 单目递增运算符重载Date& operator++() {day++;checkDate();return *this;}// 成员函数用于输出日期void diplayDate() const {cout << day << "/" << month << "/" << year;}
};int main() {Date today(28, 2, 2024); // 今天是2024年2月28日today.diplayDate(); // 使用成员函数输出日期cout << endl; // 输出换行++today;       // 使用重载后的递增运算符today.diplayDate(); // 使用成员函数输出日期cout << endl; // 输出换行system("pause");return 0;
}

PS: 还可以使用后缀运算符,但如果只是想执行递增递减运算,应当选择前缀运算符。
因为在后缀运算符中,首先会复制当前对象,再对当前对象执行递增递减运算,最后返回复制对象,会多一步临时拷贝的步骤,且这个创建的临时拷贝也不会被使用

3.转换运算符

示例代码如下:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;class Date {
private:int day;int month;int year;string dateInString; // 用于存储格式化后的日期字符串// 简化版的日期合法性检查void checkDate() {// 如果是2月28日,增加到3月1日(这里不考虑闰年)if (month == 2 && day == 29) {day = 1;month = 3;}// 如果月份超过12,增加年份if (month > 12) {month = 1;year++;}}public:// 构造函数,初始化日期并检查合法性Date(int d, int m, int y) : day(d), month(m), year(y) {checkDate();}// 单目递增运算符重载,将日期递增一天Date& operator++() {day++;checkDate();return *this;}// 类型转换运算符,将Date对象转换为const char*类型// 这样,Date对象可以直接被ostream类使用,如coutoperator const char* (){// 使用ostringstream将日期转换为字符串ostringstream oss;oss << month << "/" << day << "/" << year;// 将转换后的字符串存储在dateInString中dateInString = oss.str();// 返回字符串的C风格字符数组(const char*)return dateInString.c_str();}
};int main() {Date today(28, 2, 2024); // 使用类型转换运算符将Date对象转换为const char*,并使用cout输出cout << "Tomorrow's date: " << today << endl;system("pause");return 0;
}

通过类型转化后,可以使用cout直接输出

4.双目运算符

可以对两个操作数进行操作的运算符
在这里插入图片描述

5.函数运算符operator()

函数运算符允许类的实例表现得就函数一样,可以接受参数返回结果

#include <iostream>
#include <string>class SimpleFunc {
public:// 重载()运算符,使其可以像函数一样被调用int operator()(int a, int b) {return a + b; // 这里我们简单地返回两个数的和}
};int main() {SimpleFunc func; // 创建SimpleFunc的实例// 使用SimpleFunc实例来计算两个数的和int result = func(3, 5); // 调用func对象,传入3和5作为参数// 输出结果std::cout << "The sum of 3 and 5 is: " << result << std::endl;system("pause");return 0;
}

6.移动构造函数和移动赋值运算符

移动构造函数和移动赋值运算符是性能优化功能,用于高性能编程,属于C++11标准的一部分,旨在避免复制不必要的临时值

移动构造函数: 移动构造函数是一个接受一个同类型对象的右值引用作为参数的构造函数。它的主要目的是在对象的构造过程中,将资源从另一个对象“移动”过来,而不是进行复制

class MyClass {
public:MyClass(MyClass&& other) noexcept {//声明方法// 移动资源}
};

移动赋值运算符: 移动赋值运算符是一个接受一个同类型对象的右值引用作为参数的赋值运算符。它允许一个对象通过接管另一个对象的资源来改变其状态,而不是通过复制

class MyClass {
public:MyClass& operator=(MyClass&& other) noexcept {//声明方法// 移动资源并赋值return *this;}
};

7.不能重载的运算符

在这里插入图片描述

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

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

相关文章

实践指南:如何将SpringBoot项目无缝部署到Tomcat服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

TypeScript学习日志-第二十四天(webpack构建ts+vue3)

webpack构建tsvue3 一、构建项目目录 如图&#xff1a; shim.d.ts 这个文件用于让ts识别.vue后缀的 后续会说 并且给 tsconfig.json 增加配置项 "include": ["src/**/*"] 二、基础构建 安装依赖 安装如下依赖&#xff1a; npm install webpack -D …

Linux系统(CentOS)下安装配置 Nginx 超详细图文教程

一、下载并安装 1.打开nginx官网并点击右侧的download&#xff0c;Nginx官网下载地址 2.选择稳定版本 我放在/usr/local/nginx/下&#xff0c;新建文件夹 mkdir /usr/local/nginx/ 通过xftp传输到Linux的服务器上&#xff0c;这里方法不过多复述。 或者如果Linux联网&#xf…

国内如何访问 OpenAI 的 api

这个问题甚至我的一些大厂的朋友也不太清楚&#xff0c;所以我觉得有必备写一篇文章来简单盘盘它&#xff0c;希望能帮助到有需要的人 众所周知&#xff0c;由于大陆与 OpenAI 双方互相封锁&#xff0c;大陆是无法直接访问 OpenAI api 的 不过由于 GPT 4 的统治地位&#xff0c…

CCF-Csp算法能力认证, 202303-1重复局面(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

C++ | Leetcode C++题解之第77题组合

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> temp;vector<vector<int>> ans;vector<vector<int>> combine(int n, int k) {// 初始化// 将 temp 中 [0, k - 1] 每个位置 i 设置为 i 1&#xff0c;即 [0, k - 1] 存…

标准引领 | 竹云参编《面向云计算的零信任体系》行业标准正式发布!

近日&#xff0c;中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日起正式实施。 该标准汇集大…

Python爬虫基础知识学习(以爬取某二手房数据、某博数据与某红薯(书)评论数据为例)

一、爬虫基础流程 爬虫的过程模块化&#xff0c;基本上可以归纳为以下几个步骤&#xff1a; 1、分析网页URL&#xff1a;打开你想要爬取数据的网站&#xff0c;然后寻找真实的页面数据URL地址&#xff1b; 2、请求网页数据&#xff1a;模拟请求网页数据&#xff0c;这里我们介…

基于SSM的“小型企业人事管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“小型企业人事管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 登录界面 个人信息页面 用户打卡页面 扣…

平航杯复现

简单介绍及前期操作 esxi镜像挂载是一个新的创新点 就根据官方的wp进行挂载就可以了&#xff0c;后面差不多常规的服务器取证操作&#xff0c;然后服务器和计算机&#xff0c;u盘取证都有点联系&#xff0c;还是需要队友配合好一点 配置网段我的建议是把本机的配置改一下&am…

「2024年」前端开发常用工具函数总结 TypeScript

前言 在前端开发中&#xff0c;工具函数是提高代码复用率、保持代码整洁和增加开发效率的关键。使用 TypeScript 编写工具函数不仅可以帮助开发者捕捉到更多的类型错误&#xff0c;还可以提供更清晰的代码注释和更智能的代码补全。下面是一些在 TypeScript 中常用的前端开发工…

Garden Planner for Mac v3.8.62注册激活版:园林绿化设计软件

Garden Planner for Mac是一款专为苹果Mac OS平台设计的园林景观设计软件。这款软件的主要功能是帮助用户设计梦想中的花园&#xff0c;包括安排植物、树木、建筑物和其他物体。 Garden Planner for Mac提供了一个包含1200多种植物和物体符号的库&#xff0c;这些符号都可以进行…

RAFT:引领 Llama 在 RAG 中发展

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《ESP8266通信指南》13-Lua 简单入门(打印数据)

往期 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP82…

hadoop学习---基于Hive的教育平台数据仓库分析案例(三)

衔接第一部分&#xff0c;第一部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;一) 衔接第二部分&#xff0c;第二部分请点击&#xff1a;基于Hive的教育平台数据仓库分析案例&#xff08;二) 学生出勤模块&#xff08;全量分析&#xff09;&#xff1a…

CTF-密码学基础

概述 密码学(Cryptolopy)&#xff1a;是研究信息系统安全保密的科学 密码学研究的两个方向&#xff1a; 密码编码学(Cryptography)&#xff1a;主要研究对信息进行编码&#xff0c;实现对信息的隐蔽密码分析学(Cryptanalytics)&#xff1a;主要研究加密信息的破译或消息的伪造…

Java | Leetcode Java题解之第78题子集

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] nums) {dfs(0, nums…

硬件知识积累 音频插座的了解,看音频插座的原理图来了解音频插座的引脚。

1. 音频接口 音频插座是一种用于连接音频信号线路的电子元件&#xff0c;常见于音频设备&#xff08;如音响、耳机、话筒等&#xff09;中。它的主要作用是将电子信号转化为声音信号&#xff0c;以满足人们对于音乐、电影、游戏等方面的需求。 根据插头形状的不同&#xff0c;音…

数据结构之单单单——链表

一.链表 1&#xff09;链表的概念 链表&#xff08;Linked List&#xff09;是一种物理存储结构上非连续&#xff0c;非顺序的储存结构&#xff0c;数据元素的逻辑顺序是通过链表中指针链接次序实现的。要注意&#xff0c;链表也是线性表----->但链表在物理结构上不是线性的…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…