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数据。对于产…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
