【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))))) 将…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
