《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,一经查实,立即删除!

相关文章

【重识python day4】

列表得方法 list&#xff0c;列表类型&#xff0c;用于存储一些数据的容器&#xff08;有序 & 可修改&#xff09;、 tuple&#xff0c;元组类型&#xff0c;用于存储一些数据的容器&#xff08;有序 & 不可修改&#xff09; 不可变类型&#xff1a;字符串、布尔、整…

如何编辑K8s中的configmap信息

1.将k8s中configmap信息映射到本地yaml文件 语法: kubectl get configmap <configmap-name> -n <namespace-name> -o yaml > configmap.yaml 实例&#xff1a; kubectl get configmap kuboard-v3-config -n kuboard -o yaml > configmap.yaml 2.编辑yam…

消息队列相关汇总

目录 一、什么是消息队列 二、Kafka怎么避免重复消费 三、RabbitMQ 的消息如何实现路由 四、如何保证RabbitMQ的消息可靠传输 五、如何进⾏消息队列选型 一、什么是消息队列 消息队列 Message Queue&#xff0c;简称 MQ。是一种应用间的通信方式&#xff0c;主要由三个部分…

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; 当然以上只是一些…

初识Electron,创建桌面应用

历史小剧场 呜呼&#xff01;古有匈奴犯汉&#xff0c;晋室不纲&#xff0c;铁木夺宋&#xff0c;虏清入关&#xff0c;神舟陆沉二百年有余&#xff0c;中国之见灭于满清初非满人能灭之&#xff0c;能有之也因有汉奸以作虎怅&#xff0c;残同胞媚异种&#xff0c;始有吴三桂洪承…

中职数字化校园网络建设

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

Android面试题(持续更新中)

一、抽象类与接口的区别&#xff1f; 1、抽象类可以提供成员方法的实现细节&#xff0c;而接口中只能存在 public 抽象方法&#xff1b; 2、抽象类中的成员变量可以是各种类型的&#xff0c;而接口中的成员变量只能是 public static final 类型的&#xff1b; 3、接口中不能含有…

【国产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…

Windows Server 2019/2022 开启

我的环境是Windows Serve 2022 Datacenter, 21H2, 需要使用Hyper-V 与 VMWare Workstation共存&#xff0c;但是在服务器管理器中找不到Windows Hypervisor Platform安装选项。在Win10中是启动关闭Windows功能中&#xff0c;而server中找不到。 解决方法&#xff1a; 以管理员…

算法入门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;用于加密方式远程登录和其…

Laravel11 路由

基本路由 use Illuminate\Support\Facades\Route;Route::get(/greeting, function () {return Hello World; }); 项目初始自带分组&#xff0c;routes文件夹里有api、auth、console、web四个文件。 api项目是php artisan install:api&#xff0c;routes里没有api.php可以执行…

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、使…