C++——运算符重载
1、运算符重载的概念
- 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
- 运算符重载的目的是让语法更加简洁
- 运算符重载不能改变本来寓意,不能改变基础类型寓意
- 运算符重载的本质是另一种函数调用(是编译器去调用)
- 这个函数统一的名字叫operator
- 重载函数可以写成全局或成员函数
- 重载函数如果写成全局的,那么双目运算符左边的是第一个参数,右边是第二个参数
- 重载函数如果写成成员函数,那么双目运算符的左边是this,右边是第一个参数
- 不能改变运算符优先级,不能改变运算符的参数个数。
2、加号运算符重载
1、同类型的对象相加
#include <iostream>
using namespace std;class Maker
{
public:Maker(int id, int age){this->id = id;this->age = age;}//写成成员函数,那么只需要一个参数,这个参数是加号的右边Maker operator+(Maker& m2){Maker temp(this->id + m2.id, this->age + m2.age);return temp;}
public:int id;int age;
};
//重载加号运算符 全局函数方式
//Maker operator+(Maker &p1,Maker &p2)
//{
// Maker temp(p1.id + p2.id, p1.age + p2.age);
// return temp;
//}
void test()
{Maker m1(1, 10);Maker m2(2, 20);Maker m3 = m1 + m2;cout << m3.id << endl;cout << m3.age << endl;
}
int main()
{test();return 0;
}
2、不同对象类型相加
#include <iostream>
using namespace std;class Maker
{
public:Maker(int id, int age){this->id = id;this->age = age;}//写成成员函数,那么只需要一个参数,这个参数是加号的右边Maker operator+(Maker& m2){Maker temp(this->id + m2.id, this->age + m2.age);return temp;}
public:int id;int age;
};class Student
{
public:Student() {mid = 0;}Student(int id) {mid = id;}
public:int mid;
};Maker operator+(Maker& m1, Student& s1)
{Maker temp(m1.id + s1.mid, 20);return temp;
}
Student operator+(Student& s1, Maker& m1)
{Student temp(s1.mid + m1.id);return temp;
}
void test()
{Maker m1(1, 10);Student s1(2);Maker m3 = m1 + s1;cout << m3.id << endl;Student s2 = s1 + m1;cout << s2.mid<<endl;
}
int main()
{test();return 0;
}
3、减号运算符重载
#include <iostream>
using namespace std;class Maker
{
public:Maker(int id, int age){this->id = id;this->age = age;}//写成成员函数,那么只需要一个参数,这个参数是加号的右边Maker operator-(Maker& m2){Maker temp(this->id - m2.id, this->age - m2.age);return temp;}
public:int id;int age;
};
void test()
{Maker m1(10, 18);Maker m2(5, 15);Maker m3 = m1 - m2;cout << m3.id << endl;cout << m3.age << endl;
}
int main()
{test();return 0;
}
4、左移运算符重载
#include <iostream>
#include <iostream>
using namespace std;class Maker
{
public:Maker(int id, string name){this->id = id;this->name = name;}
public:int id;string name;
};
//1、形参和实参是一个对象
//2、不能改变库类中的代码
//3、ostream中把拷贝构造函数私有化了
//4、如果要和endl一起使用,那么必须返回ostream的对象
ostream& operator<<(ostream& out, Maker& m1)
{cout << m1.id << " " << m1.name << endl;return out;
}
void test()
{Maker m1(10, "薯片");cout << m1 << endl;
}
int main()
{test();return 0;
}
5、右移运算符
#include <iostream>
#include <iostream>
using namespace std;class Maker
{
public:Maker(int id, string name){this->id = id;this->name = name;}int getAge() {return this->id;}
public:int id;string name;
};istream &operator>>(istream& in, Maker& m1)
{cin >> m1.id;cin >> m1.name;return in;
}
void test()
{Maker m(10, "薯片");cin >> m;cout << m.getAge() << endl;
}
int main()
{test();return 0;
}
6、关系运算符重载
#include <iostream>
#include <iostream>
using namespace std;class Maker
{
public:Maker() {};Maker(int id){this->id = id;}bool operator==(Maker &m) {if (this->id == m.id) {return true;}return false;}bool operator!=(Maker& m) {if (this->id != m.id) {return true;}return false;}
public:int id;
};void test()
{Maker m1(10);Maker m;if (m1 == m) {cout << "真" << endl;}else {cout << "假" << endl;}if (m1 != m) {cout << "真" << endl;}else {cout << "假" << endl;}}
int main()
{test();return 0;
}
7、前置加加和后置加加
#include <iostream>
#include <iostream>
using namespace std;class Maker
{friend ostream& operator<<(ostream& os, Maker& m);
public:Maker(int id){this->id = id;}//重置前置加加Maker& operator++(){++this->id;return *this;}//重置后置加加Maker operator++(int)//占位参数,必须是int{Maker tmp(*this);//tmp是局部变量,局部变量不能以引用返回++this->id;return tmp;}
private:int id;
};ostream& operator<<(ostream& out, Maker& m) {cout << m.id << endl;return out;
}void test()
{Maker m1(10);cout << ++m1;cout << m1++;}
int main()
{test();return 0;
}
8、智能指针类
8.1、智能指针类是管理另一个类的对象的释放
#include <iostream>
#include <iostream>
using namespace std;class Maker
{
public:Maker() {cout << "Maker的无参构造" << endl;}~Maker() {cout << "Maker的析构函数" << endl;}};//智能指针类
class SmartPoint
{
public:SmartPoint(Maker* p){this->pMaker = p;}~SmartPoint(){cout << "SmartPoint的析构函数" << endl;if (this->pMaker != NULL){delete this->pMaker;this->pMaker == NULL;}}
private:Maker* pMaker;
};
void test()
{Maker* p = new Maker;//在堆区开辟的数据,需要手动delete掉SmartPoint sm(p);//栈区 会调用析构函数//当test()函数结束时,会调用smartPoint的析构函数。//在这析构函数中delete了Marker的对象,会调用Maker的析构函数
}
int main()
{test();return 0;
}

8.2、指针运算符重载
#include <iostream>
#include <iostream>
using namespace std;class Maker
{
public:Maker() {cout << "Maker的无参构造" << endl;}void printMaker(){cout << "Hello Maker" << endl;}~Maker() {cout << "Maker的析构函数" << endl;}};//智能指针类
class SmartPoint
{
public:SmartPoint(Maker* p){this->pMaker = p;}//重载指针运算符Maker* operator->(){return this->pMaker;}~SmartPoint(){cout << "SmartPoint的析构函数" << endl;if (this->pMaker != NULL){delete this->pMaker;this->pMaker == NULL;}}
private:Maker* pMaker;
};
void test()
{Maker* p = new Maker;SmartPoint sm(p);sm->printMaker();
}
int main()
{test();return 0;
}

8.3、重载星号
//重载星号Maker& operator*(){return *pMaker;}void test()
{Maker* p = new Maker;SmartPoint sm(p);(*sm).printMaker();
}
9、重载函数调用符号
9.1、类里有重载函数调用符号的类实例化的对象也叫仿函数
#include <iostream>
#include <iostream>
using namespace std;//一个类如果重载了函数调用符号,那么这个类实例化出的对象也叫仿函数
//仿函数的作用:1、方便代码维护
class Maker
{
public:Maker(string name) {this->m_Name = name;};void printMaker(){cout << "hello " <<this->m_Name<< endl;}//重载()void operator()(){cout << "hello" << endl;}
public:string m_Name;
};void test()
{Maker func("薯片");func();//看着像函数,但func是对象}
int main()
{test();return 0;
}
相关文章:
C++——运算符重载
1、运算符重载的概念 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载的目的是让语法更加简洁运算符重载不能改变本来寓意,不能改变基础类型寓意运算符重载的本质是另一种函数调用…...
前端食堂技术周刊第 70 期:Volar 的新开端、Lighthouse 10、良好的组件设计、React 纪录片、2022 大前端总结
美味值:🌟🌟🌟🌟🌟 口味:黑巧克力 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Volar 的新开端Chrome 110 的新功能Lighthouse 10Nuxt v3.2.0加速 JavaSc…...
react路由详解
在学习react路由之前,我们肯定需要安装路由。大家先运行如下命令安装路由。安装之后随我一起探索react路由。 安装 版本v6 npm i react-router-dom -S 页面准备 创建两个文件夹 pages和 router pages文件夹里面放的是页面 router文件夹里面是进行路由配置 路由…...
mysql数据库完全备份和增量备份与恢复
mysql数据备份: 数据备份方式 物理备份: 冷备:.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备:一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外…...
CF1667E Centroid Probabilities
题目描述 对于所有点数为 nnn 的树,如果其满足 对于所有 i∈[2,n]i\in [2,n]i∈[2,n],与 iii 相连的 jjj 中有且只有一个点 jjj 满足 j<ij<ij<i ,那么我们称其为好树 对于 1∼n1\sim n1∼n 每个点求出来有多少好树满足重心为 iii …...
全网详细总结com.alibaba.fastjson.JSONException: syntax error, position at xxx常见错误方式
文章目录1. 复现问题2. 分析问题3. 解决问题4. 该错误的其他解决方法5. 重要补充1. 复现问题 今天在JSONObject.parse(json)这个方法时,却报出如下错误: com.alibaba.fastjson.JSONException: syntax error, position at 0, name usernameat com.aliba…...
快速部署个人导航页:美好的一天从井然有序开始
很多人都习惯使用浏览器自带的收藏夹来管理自己的书签,然而收藏夹存在着一些问题。 经过长时间的累积,一些高频使用的重要网站和偶尔信手收藏的链接混在了一起,收藏夹因为内容过多而显得杂乱无章;收藏夹没有什么美观可言…...
【Python】如何在 Python 中使用“柯里化”编写干净且可重用的代码
对于中级Python开发者来说,了解了Python的基础语法、库、方法,能够实现一些功能之后,进一步追求的就应该是写出优雅的代码了。 这里介绍一个很有趣的概念“柯里化”。 所谓柯里化(Currying)是把接受多个参数的函数变换…...
ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现
发布者 以小海龟的话题消息为例,编程实现发布者通过/turtle1/cmd_vel 话题向 turtlesim节点发送消息,流程如图 步骤一 创建功能包(工作空间为~/catkin_ws/src) $ cd ~/catkin_ws/src $ catkin_create_pkg learning_topic roscpp rospy s…...
Linux进程概念(一)
文章目录Linux进程概念(一)1. 冯诺依曼体系结构2. 操作系统(Operator System)2.1 考虑2.2 如何理解操作系统对硬件做管理?2.3 操作系统为什么要对软硬件资源做管理呢?2.4 系统调用和库函数概念2.5 计算机体系结构3. 进程的初步理解…...
Leetcode.1124 表现良好的最长时间段
题目链接 Leetcode.1124 表现良好的最长时间段 Rating : 1908 题目描述 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格…...
达梦数据库会话、事务阻塞排查步骤
查询阻塞的事务IDselect * from v$trxwait order by wait_time desc;--单机select * from v$dsc_trxwait order by wait_time desc;–DSC集群查询阻塞事务的会话信息select sf_get_session_sql(sess_id),* from v$sessions where trx_id69667;--单机select sf_get_session_sql(…...
sqlServer 2019 开发版(Developer)下载及安装
下载软件 官网只有2022的,2019使用百度网盘进行下载 安装下崽器 选择自定义安装 选择语言、以及安装位置 点击“安装” 安装 SQL Server 可能的故障 以上步骤安装后会弹出以上界面,如果未弹出,手动去安装目录下点击 SETUP.EXE 文件…...
使用Arthas定位问题
功能概述 首先,Arthas的常用功能大概有以下几个: 解决依赖冲突 sc命令:模糊查看当前 JVM 中是否加载了包含关键字的类,以及获取其完全名称。 sc -d 关键字 注意使用 sc -d 命令,获取 classLoaderHash命令:…...
性能测试之tomcat+nginx负载均衡
nginx tomcat 配置准备工作:两个tomcat 执行命令 cp -r apache-tomcat-8.5.56 apache-tomcat-8.5.56_2修改被复制的tomcat2下conf的server.xml 的端口号,不能与tomcat1的端口号重复,不然会启动报错 ,一台电脑上想要启动多个tomcat,…...
【手写 Vuex 源码】第十一篇 - Vuex 插件的开发
一,前言 上一篇,主要介绍了 Vuex-namespaced 命名空间的实现,主要涉及以下几个点: 命名空间的介绍和使用;命名空间的逻辑分析与代码实现;命名空间核心流程梳理; 本篇,继续介绍 Vu…...
opencv基础知识和绘图图形
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...
15- 决策回归树, 随机森林, 极限森林 (决策树优化) (算法)
1. 决策回归树: from sklearn.tree import DecisionTreeRegressor model DecisionTreeRegressor(criterionmse,max_depth3) model.fit(X,y) # X是40个点 y是一个圆 2. 随机森林 稳定预测: from sklearn.ensemble import RandomForestClassifier # model RandomForestC…...
Flink相关的记录
Flink源码编译首次编译的时候,去除不必要的操作,同时install会把Flink中的module安装到本地仓库,这样依赖当前module的其他组件就无需去远程仓库拉取当前module,节省了时间。mvn clean install -T 4 -DskipTests -Dfast -Dmaven.c…...
配置可视化-基于form-render的无代码配置服务(一)
背景 有些业务场景需要产品或运营去配置JSON数据提供给开发去使用(后面有实际业务场景的说明),原有的业务流程,非开发人员(后面直接以产品指代)把数据交给开发,再由开发去更新JSON数据。对于产…...
Nexus | 连接预测和决策:数据驱动优化的进展和挑战
文章信息论文题目为《Bridging prediction and decision: Advancesand challenges in data-driven optimization》,该文于2025年发表于《Nexus》期刊上。摘要数据驱动方法通过将预测与决策相结合,彻底改变了传统的优化方法。文章探讨了三种关键方法 ——…...
数据库连接优化:DBeaver连接阻塞问题的系统解决方案
数据库连接优化:DBeaver连接阻塞问题的系统解决方案 【免费下载链接】dbeaver DBeaver 是一个通用的数据库管理工具,支持跨平台使用。* 支持多种数据库类型,如 MySQL、PostgreSQL、MongoDB 等;提供 SQL 编辑、查询、调试等功能&am…...
解锁虚幻引擎资源解析工具的高效解析与实战应用指南
解锁虚幻引擎资源解析工具的高效解析与实战应用指南 【免费下载链接】UEViewer Viewer and exporter for Unreal Engine 1-4 assets (UE Viewer). 项目地址: https://gitcode.com/gh_mirrors/ue/UEViewer 虚幻引擎资源解析是游戏开发与逆向工程领域的关键技术࿰…...
智能排错助手:让快马AI分析你的openclaw安装错误并生成解决方案
最近在折腾openclaw这个工具时,遇到了不少安装报错的问题。作为一个经常在各类开发环境中摸爬滚打的程序员,我发现这类开源工具的安装过程往往隐藏着不少坑。不过这次尝试用AI辅助诊断后,整个排错效率提升了不少,这里记录下我的实…...
nli-distilroberta-base前端集成案例:Vue.js构建智能文本分析界面
nli-distilroberta-base前端集成案例:Vue.js构建智能文本分析界面 1. 场景价值与方案概述 电商平台的客服系统每天需要处理大量用户咨询,其中很多问题都涉及产品参数的对比(如"这款手机电池容量比A型号大吗?"…...
第10章 RTOS 感知调试(OpenOCD)
第10章 RTOS 感知调试 导读:在嵌入式开发中,RTOS(实时操作系统)的使用非常普遍。然而当多个线程并发执行时,传统的单线程调试方式无法感知任务切换和线程上下文,给问题定位带来极大困难。OpenOCD 内置了对十余种主流 RTOS 的线程感知调试支持,能够在暂停目标时自动识别所…...
【跟韩工学Ubuntu第5课】-第5章 网络管理:Netplan、路由与防火墙-004篇-Ubuntu Server 网络管理:进阶配置、优化与实战诊断
文章目录 Ubuntu Server 网络管理:进阶配置、优化与实战诊断 (扩容优化版 | 适配高校教学+生产实战 | 30页核心内容) 5.1 网络基础:深入理解与实践查看(扩容+优化) 一、核心概念进阶(新增计算案例+场景区分) 二、必备诊断命令(新增高频参数+中文注释) 三、IPv6 完整配…...
Hypervisor环境下高效进程间通信技术解析
1. Hypervisor环境下的进程通信挑战 在虚拟化技术大行其道的今天,Hypervisor环境下的进程间通信(IPC)已经成为系统性能的关键瓶颈。想象一下,你住在小区同一栋楼的两个单元里,明明直线距离只有10米,却要绕到…...
华为防火墙NAT映射选择指南:一对一映射 vs 端口映射
华为防火墙NAT映射技术深度解析:一对一映射与端口映射的实战选择 在当今企业网络架构中,如何安全高效地将内部服务暴露给外部访问是一个永恒的技术挑战。华为防火墙提供的NAT映射功能,特别是一对一映射和端口映射两种核心方案,为不…...
OpenClaw备份恢复指南:ollama-QwQ-32B模型与技能迁移方案
OpenClaw备份恢复指南:ollama-QwQ-32B模型与技能迁移方案 1. 为什么需要备份恢复方案 上周我的主力开发机突然硬盘故障,导致整个OpenClaw环境丢失。最痛苦的不是重装软件,而是那些精心调教过的技能配置和任务历史记录全部归零。这次经历让我…...
