[C++核心编程](七):类和对象——运算符重载*
目录
四则运算符重载
左移运算符重载
递增运算符重载
赋值运算符重载
关系运算符重载
函数调用运算符重载
对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型
四则运算符重载
对自定义数据类型实现四则运算(加减乘除)操作,比如:自己写成员函数,实现两个对象相加属性后返回新的对象
注意:四则运算符重载也可以进行函数重载。
总结:
1.对于内置的数据类型的表达式的的运算符是不可以改变的
2.不要滥用运算符重载
#include <iostream>using namespace std;class Person
{
public:int m_a;int m_b;Person(int a, int b) :m_a(a), m_b(b){}//成员函数重载Person operator+(const Person &p){Person rp(0, 0);rp.m_a = this->m_a + p.m_a;rp.m_b = this->m_b + p.m_b;return rp;}
};
//全局函数重载
static Person operator-(const Person& p1, const Person& p2)
{Person rp(0, 0);rp.m_a = p1.m_a - p2.m_a;rp.m_b = p1.m_b - p2.m_b;return rp;
}
//函数重载
static Person operator-(const Person& p1, const int value)
{Person rp(0, 0);rp.m_a = p1.m_a - value;rp.m_b = p1.m_b - value;return rp;
}int main(void)
{Person p1(10, 10);Person p2(10, 10);Person p3(5, 5);Person p4 = p1 + p2; //Person p4 = p1.operator+(p2);cout << "p4 m_a value:" << p4.m_a << endl;cout << "p4 m_b value:" << p4.m_b << endl;Person p5 = p4 - p3; //Person p5 = operator-(p4,p3)cout << "p5 m_a value:" << p5.m_a << endl;cout << "p5 m_b value:" << p5.m_b << endl;Person p6 = p5 - 5; //Person p6 = operator-(p5,5)cout << "p6 m_a value:" << p6.m_a << endl;cout << "p6 m_b value:" << p6.m_b << endl;system("pause");return 0;
}
左移运算符重载
输出自定义的数据类型,比如:直接输出一个对象就可以输出其成员属性
总结:左移运算符配合友元可以实现输出自定义数据类型
#include <iostream>
#include <string>using namespace std;class Person
{friend static ostream& operator<<(ostream& cout, Person& p);
public:Person(int a, int b){m_a = a;m_b = b;}
private://通常不使用 成员函数重载 左移运算符 ,无法实现cout在左侧int m_a;int m_b;
};static ostream& operator<<(ostream &cout, Person& p) // operator<<(cout, p)
{cout << "m_a=" << p.m_a << endl;cout << "m_b=" << p.m_b << endl;return cout;
}static void test(void)
{Person p(10, 10);cout << p << endl;
}int main(void)
{test();system("pause");return 0;
}
递增运算符重载
区分前置和后置的差别!!
#include <iostream>
#include <string>using namespace std;class MyInteger
{friend static ostream& operator<<(ostream& cout, MyInteger p);
public:MyInteger(int b){m_b = b;}//重载 后置,int 占位参数 int ,区分前置和后置MyInteger operator++(int){MyInteger temp = *this;++*this;return temp;}//重载 前置MyInteger& operator++() //返回引用是为了一直对一个数据进行操作{++m_b;return *this;}
private:int m_b;
};static ostream& operator<<(ostream& cout, MyInteger p) // operator<<(cout, p)
{cout << p.m_b;return cout;
}static void test(void)
{MyInteger p(0);cout << ++p << endl;cout << p << endl;
}static void test1(void)
{MyInteger p1(0);cout << p1++ << endl;cout << p1 << endl;
}int main(void)
{test();test1();system("pause");return 0;
}
赋值运算符重载
c++至少给一个类添加4个函数:前三个略
4.赋值运算符operator=,对属性进行值拷贝(注意深浅拷贝问题)
#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(int b){m_age = new int(b);}~Person(){if (m_age != NULL){delete m_age;m_age = NULL;}}Person& operator=(const Person & p) //重载赋值运算符,使用深拷贝{if (m_age != NULL){delete m_age;m_age = NULL;}m_age = new int(*p.m_age);return *this;}int *m_age;
};static void test1(void)
{Person p1(12);Person p2(19);Person p3(14);p3 = p2 = p1;cout << "p1年龄为:" << *p1.m_age << endl;cout << "p2年龄为:" << *p2.m_age << endl;cout << "p3年龄为:" << *p3.m_age << endl;
}int main(void)
{test1();system("pause");return 0;
}
关系运算符重载
重载关系运算符,让两个自定义的数据类型进行对比操作
#include <iostream>
#include <string>using namespace std;class Person
{
public:Person(string name, int age){m_name = name;m_Age = age;}bool operator==(Person& p){if (this->m_name == p.m_name && this->m_Age == p.m_Age){return true;}else {return false;}}string m_name;int m_Age;
};static void test1(void)
{Person p1("Tom", 19);Person p2("Mac", 19);if (p1 == p2){cout << "p1 == p2" << endl;}else{cout << "p1 != p2" << endl;}}int main(void)
{test1();system("pause");return 0;
}
函数调用运算符重载
- 函数调用运算符() 也可以重载
- 由于重载后使用的方式非常像函数的调用,故称仿函数
- 仿函数没有固定写法,非常灵活(返回值、参数均不固定)
#include <iostream>
#include <string>using namespace std;class Myprint
{
public:void operator()(string test){cout << test << endl;}
};class MyAdd
{
public:int operator()(int a, int b){return a + b;}
};static void test1(void)
{Myprint myprint;myprint("Hello World!");//仿函数MyAdd myadd;int result = myadd(1, 1);cout << "result = " << result << endl;//匿名函数对象cout << "result = " << MyAdd()(11, 11) << endl;
}int main(void)
{test1();system("pause");return 0;
}
推荐:[C++核心编程](五):类和对象——友元(friend)
相关文章:
[C++核心编程](七):类和对象——运算符重载*
目录 四则运算符重载 左移运算符重载 递增运算符重载 赋值运算符重载 关系运算符重载 函数调用运算符重载 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 四则运算符重载 对自定义数据类型实现四则运算(加减乘除&…...
什么是MVC和MVVM
**MVC和MVVM是两种流行的软件架构模式,它们在前端开发中被广泛采用来组织代码和管理应用程序的复杂性**。具体如下: MVC(Model-View-Controller): 1. 模型(Model):负责管理数据和业…...
物体检测-系列教程23:YOLOV5 源码解析13 (SPP层、Flatten模块、Concat模块、Classify模块)
😎😎😎物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 17、SPP模块 17.1 SPP类 SPP是一种特殊的池化策略,最初在YOLOv3-SPP中被使用…...
2024.3.6每日一题
LeetCode 找出数组中的 K -or 值 题目链接:2917. 找出数组中的 K-or 值 - 力扣(LeetCode) 题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数: 只有在 nums 中&…...
YOLOSHOW - YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 基于 Pyside6 的图形化界面
YOLOSHOW 是一个基于 PySide6(Qt for Python)开发的图形化界面应用程序,主要用于集成和可视化YOLO系列(包括但不限于YOLOv5、YOLOv7、YOLOv8、YOLOv9)的目标检测模型。YOLOSHOW 提供了一个用户友好的交互界面ÿ…...
sql高级
sql高级 SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目。 SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。 **注意:**并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据, O…...
更快更强,Claude 3全面超越GPT4,能归纳15万单词
ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了? 3月4日周一,人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人,其中包括Opus、Sonnet和Haiku三种模型,该公司声称,这是迄今为止它们开发的最快速、最强…...
devc++小游戏3.8.5
导航: Dev-c跑酷小游戏 1.0.0 devc跑酷小游戏1.2.5 devc跑酷游戏1.2.6 devc跑酷游戏2.0.0 devc跑酷游戏2.0.1 devc跑酷游戏2.4.0 devc跑酷小游戏3.5.0 更新内容 重磅回归,存档搞定!!! 每一关需要前一关已…...
Java网络通信TCP
目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象,并连接服务端的ip与端口号 2.获取Socket流对象,写入数据…...
层级锁笔记
注意看test_hierarchy_lock函数:如果thread t2的不注释,就会报错。 这是因为层级锁 更强调单个线程内上锁的顺序。 线程t2已经获取了hmtx2,再试图获取hmtx1就会因为违反层级顺序而抛出异常。 #include <mutex> #include <thread&g…...
基于SpringBoot+Vue 的专家医院预约挂号系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
计算机基础专升本笔记十二-Excel常用快捷键大全
计算机基础专升本笔记十二-Excel常用快捷键大全 Excel常用快捷键 按键作用Ctrl 0隐藏列Ctrl 1设置单元格格式Ctrl 2添加或取消字体加粗Ctrl 3添加或取消字体倾斜Ctrl 4添加或取消下划线Ctrl 5添加或取消删除线Ctrl 6隐藏或显示图形Ctrl 7隐藏工具栏Ctrl 8隐藏或显示…...
制作耳机壳的UV树脂和塑料材质相比优势有哪些?
制作耳机壳的UV树脂相比塑料材质有以下优势: 高强度与耐磨性:UV树脂具有高强度和耐磨性,能够更好地保护耳机内部零件,延长耳机使用寿命。相比之下,塑料材质可能较易磨损或刮伤。耐高温:UV树脂具有较好的耐…...
JS(JavaScript)中如何实现,复选框checkbox多选功能
起始界面: 代码元素: <p><input type"checkbox" id"checkedAll"> 全选按钮</p><p><input type"checkbox" class"cl"> 选项1</p><p><input type"checkbox&qu…...
直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容
xilinx zynq petalinux 默认编译打包出的SPI flash烧写启动文件是BOOT.BIN,然而每次需要修改rootfs内的文件时都要重新build rootfs 然后再 package一次才能生成新的BOOT.bin文件,地球人都知道petalinux编译一次是很耗时间的,那么有没有什么简…...
什么是 Golang 类型断言
类型断言:用于检查某个接口是否包含某个具体类型,语法x.(T),x是一个接口类型表达式,T是具体的类型,如果x包含的值可以被转换成T类型,则是ok 在Go语言中,任何类型的值都属于空接口类型。空接口类…...
mysql数据库root权限读写文件
如果没有shell,只有数据库权限的情况下: 1. udf 提权提示没有目录:使用数据流创建目录 1. select xxx into outfile C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\::$INDEX_ALLOCATION;2. select xxx into outfile C:\\phpstudy_pro\…...
力扣爆刷第88天之hot100五连刷26-30
力扣爆刷第88天之hot100五连刷26-30 文章目录 力扣爆刷第88天之hot100五连刷26-30一、142. 环形链表 II二、21. 合并两个有序链表三、2. 两数相加四、19. 删除链表的倒数第 N 个结点五、24. 两两交换链表中的节点 一、142. 环形链表 II 题目链接:https://leetcode.…...
Ethersacn的交易数据是什么样的(2)
分析 Raw Transanction RLP(Recursive Length Prefix)是一种以太坊中用于序列化数据的编码方式。它被用于将各种数据结构转换为二进制格式,以便在以太坊中传输和存储。RLP 是一种递归的编码方式,允许对复杂的数据结构进行编码。所…...
学习Android的第二十二天
目录 Android ContextMenu 上下文菜单 ContextMenu 范例 参考文档 Android SubMenu 子菜单 范例 参考文档 Android PopupMenu 弹出菜单 范例 参考文档 Android ContextMenu 上下文菜单 在Android开发中,ContextMenu(上下文菜单)为…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
