当前位置: 首页 > news >正文

【c++】类和对象6—运算符重载

文章目录

  • 加号(+)运算符重载
  • 左移(<<)运算符重载
  • 递增(++)运算符重载
  • 赋值(=)运算符重载
  • 关系运算符重载
  • 函数调用运算符重载


运算符重载概念:
对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

加号(+)运算符重载

作用:实现两个自定义数据类型相加的运算。

#include<iostream>
using namespace std;class Person
{
public://1、成员函数重载+号/*Person operator+(Person& p){Person temp;temp.m_A = this->m_A + p.m_A;temp.m_B = this->m_B + p.m_B;return temp;}*/int m_A;int m_B;
};//2、全局函数重载+号
Person operator+(Person& p1, Person& p2)
{Person temp;temp.m_A = p1.m_A + p2.m_A;temp.m_B = p1.m_B + p2.m_B;return temp;
}//函数重载
Person operator+(Person& p1, int num)
{Person temp;temp.m_A = p1.m_A + num;temp.m_B = p1.m_B + num;return temp;
}void test()
{Person p1;p1.m_A = 10;p1.m_B = 10;Person p2;p2.m_A = 10;p2.m_B = 10;Person p3 = p1 + p2;//1、成员函数重载本质调用://Person p3 = p1.operator+(p2);//2、全局函数重载本质调用: //Person p3 = operator+(p1, p2);Person p4 = p1 + 100;//Person+intcout << "p3.m_A=" << p3.m_A << endl;cout << "p3.m_B=" << p3.m_B << endl;cout << "p4.m_A=" << p4.m_A << endl;cout << "p4.m_B=" << p4.m_B << endl;
}int main()
{test();system("pause");return 0;
}输出:
p3.m_A=20
p3.m_B=20
p4.m_A=110
p4.m_B=110

总结:
1、对于内置的数据类型的表达式的运算符是不可能改变的;
2、不要滥用运算符重载。

左移(<<)运算符重载

作用:可以输出自定义数据类型。

#include<iostream>
using namespace std;class Person
{friend ostream& operator<<(ostream& out, Person& p);public:Person(int a,int b){m_A = a;m_B = b;}//利用成员函数重载左移运算符//p.operator<<(cout)简化版本p<<cout//不会利用成员函数重载<<,因为无法实现cout在左侧/*void operator<<(cout){}*/
private:int m_A;int m_B;
};//只能利用全局函数重载左移运算符
//ostream对象只能有一个
ostream& operator<<(ostream& out, Person& p)
{out << "m_A=" << p.m_A << "m_B=" << p.m_B;return out;//链式编程思想
}void test()
{Person p(10, 20);cout << p << endl;
}int main()
{test();system("pause");return 0;
}

总结:
重载左移运算符配合友元可以实现输出自定义数据类型。

递增(++)运算符重载

作用:通过重载递增运算符,实现自己的整型数据

#include<iostream>
using namespace std;class MyInterger
{friend ostream& operator<<(ostream& out, MyInterger myint);public:MyInterger(){m_num = 0;}//前置++//返回引用为了一种对一个数据进行递增操作MyInterger& operator++() {//先++m_num++;//再返回return *this;}//后置++//void operator++(int) int代表占位参数,可以用于区分前置和后置递增MyInterger operator++(int) {//先返回MyInterger temp = *this;//记录当前本身的值,然后让本身的值加1,但是返回的是以前的值,达到先返回后++//再++m_num++;return temp;}
private:int m_num;
};ostream& operator<<(ostream& out, MyInterger myint)
{out << myint.m_num;return out;
}//前置++,先++ 再返回
void test01()
{MyInterger myInt;cout << ++myInt << endl;cout << myInt << endl;
}//后置++,先返回 再++
void test02()
{MyInterger myInt;cout << myInt++ << endl;cout << myInt << endl;
}int main()
{test01();test02();system("pause");return 0;
}

总结:前置递增返回引用,后置递增返回值。

赋值(=)运算符重载

c++编译器至少给一个类添加4个函数:
1、默认构造函数(无参,函数体为空)
2、默认析构函数(无参,函数体为空)
3、默认拷贝构造函数,对属性进行值拷贝
4、赋值运算符operator=,对属性进行值拷贝

如果类中有属性指向堆区,做赋值操作是也会出现深浅拷贝问题。

#include<iostream>
using namespace std;class Person
{public:Person(int age){m_age = new int(age);}//重载赋值运算符Person& operator=(Person& p){if (m_age != NULL){delete m_age;m_age = NULL;}//编译器提供的代码是浅拷贝//m_age = p.m_age;//提供深拷贝解决浅拷贝的问题m_age = new int(*p.m_age);//返回自身return *this;}~Person(){if (m_age != NULL){delete m_age;m_age = NULL;}}int *m_age;
};//前置++,先++ 再返回
void test()
{Person p1(18);Person p2(20);Person p3(22);p3 = p2 = p1;//赋值操作cout << "p1的年龄为:" << *p1.m_age << endl;cout << "p2的年龄为:" << *p2.m_age << endl;cout << "p3的年龄为:" << *p3.m_age << endl;
}int main()
{test();system("pause");return 0;
}

关系运算符重载

作用:重载关系运算符,可以让两个自定义类型对象进行对比操作。

#include<iostream>
using namespace std;class Person
{public:Person(string name,int age){this->m_name = name;this->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;}}//重载关系运算符!=bool operator!=(Person& p){if (this->m_name == p.m_name && this->m_age == p.m_age){return false;}else{return true;}}string m_name;int m_age;
};void test()
{Person a("张三", 18);Person b("张三", 18);if (a == b){cout << "a和b相等" << endl;}else{cout << "a和b不相等" << endl;}if (a != b){cout << "a和b不相等" << endl;}else{cout << "a和b相等" << endl;}
}int main()
{test();system("pause");return 0;
}

函数调用运算符重载

函数调用运算符()也可以重载;
由于重载后使用的方式非常像函数的调用,因此称为仿函数;
仿函数没有固定写法,非常灵活。

#include<iostream>
using namespace std;class MyPrint
{
public://重载函数调用运算符void operator()(string test){cout << test << endl;}
};void MyPrint02(string test)
{cout << test << endl;
}void test01()
{MyPrint myprint;myprint("helloworld");//由于使用起来非常类似于函数调用,因此称为仿函数MyPrint02("helloworld");
}//仿函数调用非常灵活,没有固定写法
//加法类
class MyAdd
{
public:int operator()(int num1, int num2){return num1 + num2;}
};void test02()
{MyAdd myadd;//非匿名函数对象,名字是myaddint ret = myadd(100, 100);cout << "ret=" << ret << endl;//匿名函数对象cout << MyAdd()(100, 100) << endl;
}int main()
{test01();system("pause");return 0;
}

相关文章:

【c++】类和对象6—运算符重载

文章目录加号&#xff08;&#xff09;运算符重载左移&#xff08;<<&#xff09;运算符重载递增&#xff08;&#xff09;运算符重载赋值&#xff08;&#xff09;运算符重载关系运算符重载函数调用运算符重载运算符重载概念&#xff1a; 对已有的运算符重新进行定义&am…...

【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

6、Fatfs系统移植

注意&#xff1a;挂载Fatfs笔记 Fatfs系统读写文件的时间是不固定的&#xff0c;随机性 搭载Fatfs的外设通信方式建议开启DMA方式&#xff0c;否则应避免中断打断时序&#xff0c;导致Fatfs出现FR_DISK_ERR&#xff08;A hard error occurred in the low level disk I/O layer&…...

【数据结构与算法】数据结构的基本概念,时间复杂度

&#x1f349;内容专栏&#xff1a;【数据结构与算法】 &#x1f349;本文脉络&#xff1a;数据结构和算法的基本概念&#xff0c;时间复杂度 &#x1f349;本文作者&#xff1a;Melon西西 &#x1f349;发布时间 &#xff1a;2023.2.21 目录 一、引入&#xff1a; 二、数据结…...

【Python】变量类型,赋值+多个变量赋值

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 好像还有一些小伙伴还不是很会python的基础鸭~ 没关系啦~这不是还有我小熊猫嘛 ~ 源码资料电子书:点击此处跳转文末名片获取 Python 变量类型 变量是存储在内存中的值&#xff0c; 这就意味着在创建变量时会在内存中开辟一个空间。 基于…...

Qt基础之二十九:图形视图框架(Graphics View Framework)及其应用

无意中从网络获取一份俄罗斯方块源码,基于图形视图框架(Graphics View Framework)实现的。当然源码的核心从来都不是界面,而是方块的移动、变形和消除等算法。源码非常完整,注释详细,经改动后已能在Qt5中运行,下面是运行效果,背景音乐和音效也是有的。 一.效果 二.原理 …...

电商平台销量查询:2023年1月牛奶乳品热门排行榜

随着人们消费能力的提升以及健康意识的增强&#xff0c;牛奶乳品已经成为居民日常饮食中的重要组成部分&#xff0c;伴随人们整体消费的增长&#xff0c;牛奶乳品行业也越来越成熟。 今年1月份我国牛奶乳品行业的整体趋势如何呢&#xff1f;结合数据我们一同来分析&#xff01;…...

应用层协议

目录 应用层常见协议 DNS协议 前言 域名结构 DNS服务器分类 DNS的工作原理 DNS工作原理实例 DNS记录 DHCP协议 静态IP与动态IP DHCP协议好处 DHCP分配IP地址的4阶段 电子邮件 邮件的过程 电子邮件发送过程 pop协议特点 IMAP协议的特点 FTP协议 前言 FTP数据…...

Golang调用FFmpeg转换视频流

问题背景 问题背景是在&#xff0c;由于视频采集端使用的是H264编码采集的裸流&#xff0c;而网络流媒体大多是以FLV为主的直播方式进行的&#xff0c;为了实现实时直播&#xff0c;当前是打算直接使用FFmpeg将H264裸流实时转成FLV视频流。 为什么是使用FLV视频流呢&#xff0c…...

外卖点餐小程序开发

前言 餐饮行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,餐饮行业也在发生着变化,单就点餐这一方面,利用手机点单正在逐步进入人们的生活。传统的点餐方式,不仅会耗费大量的人力、时间,有时候还会出错。小程序系统伴随智能手机为我们提供了新的方向。 手机…...

华为OD机试真题Python实现【猴子爬山】真题+解题思路+代码(20222023)

猴子爬山 题目 一天一只顽猴想要从山脚爬到山顶, 途中经过一个有n个台阶的阶梯, 但是这个猴子有个习惯,每一次只跳1步或3步 试问?猴子通过这个阶梯有多少种不同的跳跃方式 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 输入只…...

wordpress 网站备份

一个网站从建站完成之日&#xff0c;备份的问题就要提上日程。不论是后期的更换服务器&#xff0c;更换域名&#xff0c;未知故障导致网站崩溃&#xff0c;数据丢失&#xff0c;只要我们有完整的备份&#xff0c;就能将损失降到最低。wordpress网站的备份方法多种多样&#xff…...

如何尽早解决需求变更隐患,降低项目延期风险?

频繁的需求变更&#xff0c;在早期我们应该如何尽早解决需求变更隐患&#xff0c;降低项目延期风险&#xff1f; 1、科学分析获取真实需求 建立需求基线 科学分析用户需求&#xff0c;颗粒度越小越好。需要提前建立需求基线&#xff0c;需求基线是需求变更的依据&#xff0c;并…...

[机缘参悟-96] :软件中到处充满了人类社会的气息!

解读操作系统有感&#xff1a;CPU对于CPU内核而言&#xff0c;调度程序是程序&#xff0c;应用程序也是程序&#xff0c;在它眼里是一样的、公平看待的&#xff0c;因此某种愿意上讲&#xff0c;CPU内核本身就是“上天”&#xff0c;就是“道”&#xff0c;道德经中讲“天地不仁…...

知识点滴 - 自行车分类

旅行车 旅行自行车&#xff08;Touring bicycle&#xff09;由公路自行车发展而来&#xff0c;适合超远程自给自足的旅行&#xff0c;有较舒适放松的车架几何设计&#xff0c;能够负重&#xff0c;有很低的最低档位&#xff0c;配件选择方面追求可靠耐用。 专业的长途旅行车均以…...

【建议收藏】Jenkins+postman+newman之API全自动化测试

1 背景 本文要介绍的环境在我司已经投入使用&#xff0c;举个简单的真实使用场景&#xff0c;开发提供了300多个API&#xff0c;每个API都有各种参数&#xff0c;所以我们会先在postman中为这300多个API编写300*n个testcase&#xff0c;然后在jenkins上跑&#xff1b;到此有人…...

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表&#xff0c;事务B修改了id2的name字段为李老四&#xff0c;但是没有提交&#xff0c;事务A查询id2的数据&#xff0c;得到name为李老四&#xff1b;事务B发生回滚&#xff0c;id2的数据的name又变回李四&…...

为啥Python多线程爬虫跑的慢?

单线程和多线程进行数据抓取结果还是大有不同的&#xff0c;但是要值得注意的事&#xff0c;如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。 知识点 线程&#xff08;Thread&#xff09;也叫轻量级进程&#xff0…...

万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

关于作者 英文原版作者&#xff1a;杨靖锋&#xff0c;现任亚马逊科学家&#xff0c;本科毕业于北大&#xff0c;硕士毕业于佐治亚理工学院&#xff0c;师从 Stanford 杨笛一教授。 杨昊桐 译&#xff0c;王骁 修订 感谢靳弘业对第一版稿件的建议&#xff0c;感谢陈三星&am…...

Kaldi语音识别技术(八) ----- 整合HCLG

Kaldi语音识别技术(八) ----- 整合HCLG 文章目录Kaldi语音识别技术(八) ----- 整合HCLGHCLG 概述组合LG.fst可视化 LG.fst组合CLG.fst可视化CLG.fst生成H.fst组合HCLG.fst生成HaCLG.fst生成HCLG.fstHCLG 概述 HCLG min(det(H o min(det(C o min(det(L o G&#xff09;)))) 将…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...