【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—运算符重载
文章目录加号()运算符重载左移(<<)运算符重载递增()运算符重载赋值()运算符重载关系运算符重载函数调用运算符重载运算符重载概念: 对已有的运算符重新进行定义&am…...
【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
6、Fatfs系统移植
注意:挂载Fatfs笔记 Fatfs系统读写文件的时间是不固定的,随机性 搭载Fatfs的外设通信方式建议开启DMA方式,否则应避免中断打断时序,导致Fatfs出现FR_DISK_ERR(A hard error occurred in the low level disk I/O layer&…...
【数据结构与算法】数据结构的基本概念,时间复杂度
🍉内容专栏:【数据结构与算法】 🍉本文脉络:数据结构和算法的基本概念,时间复杂度 🍉本文作者:Melon西西 🍉发布时间 :2023.2.21 目录 一、引入: 二、数据结…...
【Python】变量类型,赋值+多个变量赋值
嗨害大家好鸭~我是小熊猫(✿◡‿◡) 好像还有一些小伙伴还不是很会python的基础鸭~ 没关系啦~这不是还有我小熊猫嘛 ~ 源码资料电子书:点击此处跳转文末名片获取 Python 变量类型 变量是存储在内存中的值, 这就意味着在创建变量时会在内存中开辟一个空间。 基于…...
Qt基础之二十九:图形视图框架(Graphics View Framework)及其应用
无意中从网络获取一份俄罗斯方块源码,基于图形视图框架(Graphics View Framework)实现的。当然源码的核心从来都不是界面,而是方块的移动、变形和消除等算法。源码非常完整,注释详细,经改动后已能在Qt5中运行,下面是运行效果,背景音乐和音效也是有的。 一.效果 二.原理 …...
电商平台销量查询:2023年1月牛奶乳品热门排行榜
随着人们消费能力的提升以及健康意识的增强,牛奶乳品已经成为居民日常饮食中的重要组成部分,伴随人们整体消费的增长,牛奶乳品行业也越来越成熟。 今年1月份我国牛奶乳品行业的整体趋势如何呢?结合数据我们一同来分析!…...
应用层协议
目录 应用层常见协议 DNS协议 前言 域名结构 DNS服务器分类 DNS的工作原理 DNS工作原理实例 DNS记录 DHCP协议 静态IP与动态IP DHCP协议好处 DHCP分配IP地址的4阶段 电子邮件 邮件的过程 电子邮件发送过程 pop协议特点 IMAP协议的特点 FTP协议 前言 FTP数据…...
Golang调用FFmpeg转换视频流
问题背景 问题背景是在,由于视频采集端使用的是H264编码采集的裸流,而网络流媒体大多是以FLV为主的直播方式进行的,为了实现实时直播,当前是打算直接使用FFmpeg将H264裸流实时转成FLV视频流。 为什么是使用FLV视频流呢,…...
外卖点餐小程序开发
前言 餐饮行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,餐饮行业也在发生着变化,单就点餐这一方面,利用手机点单正在逐步进入人们的生活。传统的点餐方式,不仅会耗费大量的人力、时间,有时候还会出错。小程序系统伴随智能手机为我们提供了新的方向。 手机…...
华为OD机试真题Python实现【猴子爬山】真题+解题思路+代码(20222023)
猴子爬山 题目 一天一只顽猴想要从山脚爬到山顶, 途中经过一个有n个台阶的阶梯, 但是这个猴子有个习惯,每一次只跳1步或3步 试问?猴子通过这个阶梯有多少种不同的跳跃方式 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 输入只…...
wordpress 网站备份
一个网站从建站完成之日,备份的问题就要提上日程。不论是后期的更换服务器,更换域名,未知故障导致网站崩溃,数据丢失,只要我们有完整的备份,就能将损失降到最低。wordpress网站的备份方法多种多样ÿ…...
如何尽早解决需求变更隐患,降低项目延期风险?
频繁的需求变更,在早期我们应该如何尽早解决需求变更隐患,降低项目延期风险? 1、科学分析获取真实需求 建立需求基线 科学分析用户需求,颗粒度越小越好。需要提前建立需求基线,需求基线是需求变更的依据,并…...
[机缘参悟-96] :软件中到处充满了人类社会的气息!
解读操作系统有感:CPU对于CPU内核而言,调度程序是程序,应用程序也是程序,在它眼里是一样的、公平看待的,因此某种愿意上讲,CPU内核本身就是“上天”,就是“道”,道德经中讲“天地不仁…...
知识点滴 - 自行车分类
旅行车 旅行自行车(Touring bicycle)由公路自行车发展而来,适合超远程自给自足的旅行,有较舒适放松的车架几何设计,能够负重,有很低的最低档位,配件选择方面追求可靠耐用。 专业的长途旅行车均以…...
【建议收藏】Jenkins+postman+newman之API全自动化测试
1 背景 本文要介绍的环境在我司已经投入使用,举个简单的真实使用场景,开发提供了300多个API,每个API都有各种参数,所以我们会先在postman中为这300多个API编写300*n个testcase,然后在jenkins上跑;到此有人…...
MySQL数据库————MVCC
MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表,事务B修改了id2的name字段为李老四,但是没有提交,事务A查询id2的数据,得到name为李老四;事务B发生回滚,id2的数据的name又变回李四&…...
为啥Python多线程爬虫跑的慢?
单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。 知识点 线程(Thread)也叫轻量级进程࿰…...
万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的
关于作者 英文原版作者:杨靖锋,现任亚马逊科学家,本科毕业于北大,硕士毕业于佐治亚理工学院,师从 Stanford 杨笛一教授。 杨昊桐 译,王骁 修订 感谢靳弘业对第一版稿件的建议,感谢陈三星&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))))) 将…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
