《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://www.mzph.cn/pingmian/5334.shtml

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

相关文章

GCB | 陆地生态系统C:N:P化学计量对降水变化的响应

西北农林科技大学水保学院上官周平研究员团队在陆地生态系统C:N:P化学计量对降水变化的响应方面取得新进展&#xff0c;并以“C:N:P stoichiometry of plants, soils, and microorganisms: Response to altered precipitation”为题发表在国际生态环境领域著名期刊Global Chang…

AI发展势头强劲,或许会催生这些职业!

AI&#xff08;人工智能&#xff09;的发展正在并将继续催生多种新的职业&#xff0c;这些职业通常与AI的设计、开发、测试、部署、监管、维护以及与其互动和应用相关。 按照现在AI发展的趋势来看&#xff0c;可预测的一些新兴职业大概有下面这些&#xff1a; 当然以上只是一些…

中职数字化校园网络建设

中职&#xff08;职校&#xff09;数字化校园的校园网建设立足于职业教育、职业学校的特点&#xff0c;充分注意到信息技术的飞速发展、通信成本的迅速降低的特点。在规划和建设校园网时&#xff0c;遵循以下原则&#xff1a; 采用通用和成熟的技术&#xff1a;采用通用的、成熟…

【国产NI替代】NI-9235 10 kS/s/ch,120 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;120 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9235可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂&#xff0c;貌似毫无用处&#xff01;后来的后来&#xff0c;终于渐渐明白搞懂算法背后的核心思想&#xff0c;能让你写出更加优雅的代码。就像一首歌唱的那样&#xff1a;后来&#xff0c;我总算学会了如何去爱&#xff0c;可惜你早已远…

【漏洞复现】若依druid 未授权访问漏洞

0x01 产品简介 若依&#xff08;Ruoyi&#xff09;框架是一款基于Spring Boot、Spring Cloud、OAuth2与JWT鉴权等核心技术的快速开发平台。它支持多种安全框架和持久化框架&#xff0c;并采用前后端分离的模式进行开发&#xff0c;具备高度的灵活性和可扩展性。若依框架提供了…

C语言指针和数组的一些笔试题

文章目录 前言一、一维数组二、字符数组-1三、字符数组-2总结 前言 C语言指针和数组的一些笔试题 一、一维数组 #include <stdio.h> int main() {int a[] { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a 0));printf("%d\n…

经典网络解读——Efficientnet

论文&#xff1a;EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks&#xff08;2019.5&#xff09; 作者&#xff1a;Mingxing Tan, Quoc V. Le 链接&#xff1a;https://arxiv.org/abs/1905.11946 代码&#xff1a;https://github.com/tensorflow/t…

【笔试训练】day15

1.平方数 水题直接看代码 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; int main() {ll x;cin >> x;ll a sqrt(x);if (abs(a * a -…

git 配置相关

问题一&#xff1a;ssh-keygen -t ed25519 -C "Gitee SSH Key" 这个命令中的 ed25519 字符是什么意思&#xff1f; ssh-keygen 是一个用于生成SSH密钥的工具&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录和其…

2024抖音AI图文带货班:在这个赛道上 乘风破浪 拿到好效果

课程目录 1-1.1 AI图文学习指南 1.mp4 2-1.2 图文带货的新机会 1.mp4 3-1.3 2024年优质图文新标准 1.mp4 4-1.4 图文如何避免违规 1.mp4 5-1.5 优质图文模板解析 1.mp4 6-2.1 老号重启 快速破局 1.mp4 7-2.2 新号起号 不走弯路 1.mp4 8-2.3 找准对标 弯道超车 1.mp4 9…

JMeter 请求头信息配置详解

在进行 Web 测试和 API 测试时&#xff0c;正确配置 HTTP 请求头是关键步骤之一&#xff0c;尤其当使用诸如 JMeter 这样的强大工具时。在本文中&#xff0c;我将详细介绍如何在 JMeter 中有效地配置和管理HTTP请求头。 在 JMeter 中添加和配置 HTTP 请求头 步骤 1: 打开 HTT…

Sy8网络管理命令(ubuntu23.10和centos8)

前言、 本次实验主要是扩展学习&#xff0c;不仅限在课本的内容。毕竟课本的内容太过于陈旧了。需要的童鞋看看。 说明&#xff1a;&#xff08;书本中sy9”第3.实验内容“大家还是要做下。&#xff09; 1、使用ubuntu做实验的童鞋只要看第二、三、四、七章节的部分内容。 2、使…

文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs)

1. 文件分块 将大文件切分成较小的片段&#xff08;通常称为分片或块&#xff09;&#xff0c;然后逐个上传这些分片。这种方法可以提高上传的稳定性&#xff0c;因为如果某个分片上传失败&#xff0c;只需要重新上传该分片而不需要重新上传整个文件。同时&#xff0c;分片上传…

21.哀家要长脑子了!

1.21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 我做过啊&#xff0c;为什么还是不能独立做出来&#xff0c;为什么为什么啊啊啊 嘻嘻奔向五一 是这样的&#xff1a; 要按升序连接&#xff0c;以链表2头结点作为开端&#xff0c;哪个小就先连接哪个&#xff…

CarEye 智能叉车管理系统

CarEye 团队在智能车辆管理平台基础上&#xff0c;专门针对叉车管理特殊性开发了叉车管理系统。以下是叉车管理系统的一些主要介绍&#xff1a;

【数据分析面试】35.20个机器学习问答题

在数据分析领域&#xff0c;机器学习是一个至关重要的技术&#xff0c;它可以帮助分析师从数据中发现模式、预测趋势和做出推断。机器学习模型可以自动学习并改进其性能&#xff0c;从而为业务决策提供有力支持。在面试中&#xff0c;了解面试者对机器学习的理解和应用能力是至…

使用 ArcGIS 对洪水预测进行建模

第一步 — 下载数据 所有数据均已包含在 Esri 提供的项目压缩文件中。我将创建一个名为“Stowe_Hydrology.gdb”的新地理数据库,在其中保存这些数据以及创建的所有后续图层。 1-0。斯托市边界 斯托城市边界是佛蒙特州地理信息中心提供的矢量要素类面。我将这一层称为“Stow…

呆马科技——智慧应急执法监管平台

在当今社会&#xff0c;安全生产的重要性日益凸显。对于各级政府和企事业单位&#xff0c;当务之急是如何高效地对突发事件进行执法管理。平台应运而生&#xff0c;旨在通过信息化、智能化技术&#xff0c;提升安全管理的效率与准确性。 一、平台特点 整合各类平台的信息资源&…

Linux-进程间通信(进程间通信介绍、匿名管道原理及代码使用、命名管道原理及代码使用)

一、进程通信介绍 1.1进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某…