C++类和对象——运算符重载详解

目录

1.运算符重载概念

2.加号运算符重载

 通过全局函数重载

代码示例:

3.左移运算符重载

代码示例:

4.递增运算符重载

代码示例:

5.赋值运算符重载 

深拷贝

代码示例: 

6.关系运算符重载 

代码示例: 

7.函数调用运算符重载

匿名函数对象


1.运算符重载概念

2.加号运算符重载

 

比方说,有一个名称为person的类,里面有m_A和m_B这两个成员

我们想实现它们相加的操作,可以写这样一个函数

 

我们只需要将函数名替换为operator+

就可以对加号运算符进行重载,简化代码 

 

也可以通过全局函数重载

 通过全局函数重载

 

代码示例:

#include<bits/stdc++.h>
using namespace std;class person
{
public://成员函数重载+运算符// person operator+(person &p)// {// person temp;// temp.a = this -> a + p.a;// temp.b = this -> b + p.b;// return temp;// }int a;int b;
};//全局函数重载加号运算符
person operator+(person &p1,person &p2)
{person temp;temp.a = p1.a + p2.a;temp.b = p1.b + p2.b;return temp;
}int main()
{person p1;p1.a = 5;p1.b = 10;person p2;p2.a = 3;p2.b = 9;person p3 = p1 + p2;cout << p3.a << endl;cout << p3.b << endl;return 0;
}

 

3.左移运算符重载

 如果要输出私有成员可以配合友元

只能用全局函数进行重载

cout是标准输出流对象,ostream 

代码示例:

#include<bits/stdc++.h>
using namespace std;class person
{
public://成员函数重载int a;int b;
};//全局函数重载
ostream & operator<<(ostream &cout,person &p){cout << p.a << endl;cout << p.b << endl;return cout;
}int main()
{person p;p.a = 5;p.b = 10;cout << p << endl;return 0;
}

 

4.递增运算符重载

cout << ++a是先让a加一,再执行这个表达式

cout << a++是先执行这个表达式,再让a加一

代码示例:

#include<bits/stdc++.h>
using namespace std;class integer
{
public:integer(){num = 0;}//重载前置++运算符//返回&引用是为了一直对一个数据进行递增操作integer & operator++(){num++;return *this;}//重载后置++运算符//int是一个占位参数//可以用于区分前置和后置递增integer operator++(int){integer temp = *this;num++;return temp;}int num;
};//后面的i前面不用&,不然写in++的时候会报错
//因为返回的是temp,temp是局部变量
ostream & operator<<(ostream &cout,integer i){cout << i.num << endl;return cout;
}int main(){integer i;cout << ++(++i) << endl;integer in;cout << in++ << endl;cout << in << endl;return 0;
}

 

5.赋值运算符重载 

深拷贝

这里涉及到深浅拷贝的问题

不懂的可以看http://t.csdnimg.cn/FHNI4 

 

代码示例: 

#include<bits/stdc++.h>
using namespace std;class person
{
public:person(int a){age = new int(a);}~person(){if(age != NULL){delete age;age = NULL;}}//返回引用才是它真正的自身person& operator=(person &p){//编译器提供的是浅拷贝//age = p.age;//应该先判断是否有属性在堆区//如果有,先释放干净//再进行深拷贝if(age != NULL){delete age;age = NULL;}age = new int(*p.age);return *this;}int *age;
};int main()
{person p1(18);person p2(20);person p3(22);p3 = p2 = p1;cout << *p1.age << endl;cout << *p2.age << endl;cout << *p3.age << endl;return 0;
}

 

6.关系运算符重载 

代码示例: 

#include<bits/stdc++.h>
using namespace std;class person
{
public:person(string name,int age){this -> name = name;this -> age = age;}bool operator==(person &p){if(this -> name == p.name && this -> age == p.age)return true;elsereturn false;}string name;int age;
};int main()
{person p1("xiaoming",18);person p2("xiaoming",18);if(p1 == p1){cout << "p1与p2相等" << endl;}return 0;
}

 

7.函数调用运算符重载

匿名函数对象

特点为:当前行执行完后立即被释放 

int main()
{test p;p("hello world");p(5,6);//匿名函数对象test()("hello world !!!");test()(7,9);return 0;
}

代码示例: 

#include<bits/stdc++.h>
using namespace std;class test
{
public:void operator()(string test){cout << test << endl;}void operator()(int a,int b){cout << a+b << endl;}};int main()
{test p;p("hello world");p(5,6);//匿名函数对象test()("hello world !!!");test()(7,9);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSVC++远程调试

1. 介绍 MSVC的调试功能非常强大&#xff0c;可以下断点&#xff0c;单步调试&#xff0c;查看堆栈变量信息等。实际用于生产的电脑环境复杂&#xff0c;更容易发生Bug。生产电脑&#xff0c;由于各种原因有些可能无法安装MSVC用来现场调试。基于打印日志&#xff0c;查看日志…

【MATLAB】PSO_BiLSTM神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO_BiLSTM神经网络回归预测算法是一种结合了粒子群优化&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;和双向长短期记忆网络&#xff08;Bidirectional Long Shor…

JAVASE进阶:String常量池内存原理分析、字符串输入源码分析

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;JAVASE进阶&#xff1a;内存原理剖析&#xff08;1&#xff09;——数组、方法、对象、this关键字的内存原理 &#x1f4da;订阅…

CoroNa Green acetoxymethyl (AM) ester,具有良好的细胞膜穿透能力

CoroNa Green, AM, Cell Permeant&#xff0c;CoroNa Green acetoxymethyl (AM) ester&#xff0c;CoroNa Green, AM&#xff0c;Sodium indicator 钠离子指示剂&#xff08;荧光探针&#xff09;&#xff0c;具有良好的细胞膜穿透能力&#xff0c;能够检测到细胞内钠离子的微小…

带大家详细了解msvcr120.dll丢失的原因,msvcr120.dll丢失怎样修复的方法

在使用电脑和运行应用程序时&#xff0c;我们经常会遇到与动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;文件相关的错误。其中之一是 "msvcr120.dll 丢失" 的错误提示。今天我们就来详细的了解一下msvcr120.dll这个文件和分享msvcr120.dll丢失怎样修…

【目标检测】对DETR的简单理解

【目标检测】对DETR的简单理解 文章目录 【目标检测】对DETR的简单理解1. Abs2. Intro3. Method3.1 模型结构3.2 Loss 4. Exp5. Discussion5.1 二分匹配5.2 注意力机制5.3 方法存在的问题 6. Conclusion参考 1. Abs 两句话概括&#xff1a; 第一个真正意义上的端到端检测器最…

stm32--simulink开发之--timer的学习,硬件输入中断,触发事件,STM32通用定时器之输出比较模式与PWM模式(重要理解)

下面三个模块&#xff0c;一个比一个高级&#xff0c;当然使用是越来越简单 STM32F4xx系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器(推荐学习) 1&#xff0c;第一个模块&#xff1a;Timer Starts timer counter and provides current counter value Timer …

vivado 与系统设计师接口

与系统设计师接口 作为迭代I/O和时钟规划过程的一部分&#xff0c;您可以交换有关AMD设备通过导出CSV文件和IBIS模型&#xff0c;与PCB或系统设计者进行引脚连接。根据PCB或设计规范的变化&#xff0c;您可能需要将引脚重新导入为如定义和配置I/O端口中所述。完成I/O和时钟中的…

uniapp H5 px转换rpx

uniapp H5 px转换rpx 安装 px2rpx 重启 HBuilderX在要转换的文件 点击右键 点击 开启px2rpx(1px转成2rpx) 开启成功&#xff01;使用 编辑页面后 按下键盘 Ctrl s 保存&#xff01;转化成功&#xff01;当然 你也需要对使用的插件 进行转换&#xff01;否则可能导致样式出现…

排序之计数排序

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

简述MinewSemi的GNSS模块引领体育与健康科技革新

体育与健康科技领域的创新一直在推动人们更健康、更活跃的生活方式。创新微公司的GNSS模块正成为这一变革的关键推动力。本文将深入研究MinewSemi的GNSS模块在体育和健康追踪领域的创新应用&#xff0c;探讨其如何帮助个体更全面地了解和改善自己的身体状态。 1. 个性化运动轨迹…

爬什么值得买的榜单——爬虫练习题目一(问)

爬虫题目你敢试试吗&#xff1f; 引言具体原因网站思路总体 我让AI给个框架1. **项目初始化与依赖安装**2. **定义数据模型**3. **网络请求模块**4. **页面解析模块**5. **数据存储模块**6. **主程序流程** 结尾 引言 最近在做什么呢 建立一套完整的信息输入输出系统 在我上一…

Vue之状态管理的简单使用(事件总线(Event Bus),Vuex和若依前端示例)

文章目录 Vue之状态管理的简单使用&#xff08;事件总线&#xff08;Event Bus&#xff09;&#xff0c;Vuex和若依前端示例&#xff09;Vue之事件总线&#xff08;Event Bus&#xff09;的简单使用Vuex进行状态管理的简单使用若依前端代码store状态管理&#xff1a; Vue之状态…

云原生时代下,操作系统生态的挑战与机遇

在云计算快速发展的背景下&#xff0c;服务器操作系统的产业升级&#xff0c;不再局限于物理服务器层面&#xff0c;市场边界扩张&#xff0c;人工智能、大数据、云计算等新技术的发展也对操作系统的灵活度和智能化提出新的要求。在 2023 龙蜥操作系统大会上&#xff0c;龙蜥社…

pytorch学习笔记(十二)

以下代码是以CIFAR10这个10分类的图片数据集训练过程的完整的代码。 训练部分 train.py主要包含以下几个部件&#xff1a; 准备训练、测试数据集用DateLoader加载两个数据集&#xff0c;要设置好batchsize创建网络模型&#xff08;具体模型在model.py中&#xff09;设置损失函…

深入了解C++:底层编译原理

进程的虚拟空间划分 任何编程语言&#xff0c;都会产生两样东西&#xff0c;指令和数据。 .exe程序运行的时候会从磁盘被加载到内存中&#xff0c;但是不能直接加载到物理内存中。Linux会给当前进程分配一块空间&#xff0c;比如x86 32位linux环境下会给进程分配2^32(4G)大小…

vue3页面跳转产生白屏,刷新后能正常展示的解决方案

可以依次检查以下问题&#xff1a; 1.是否在根组件标签最外层包含了个最大的div盒子包裹内容。 2.看看是否在template标签下面直接有注释&#xff0c;如果有需要把注释写到div里面。&#xff08;即根标签下不要直接有注释&#xff09; 3.在router-view 中给路由添加key标识。 …

(附源码)ssm 招聘信息管理系统-计算机毕设 78049

ssm 招聘客户管理系统 摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的…

脚本工具 mktemp 和 install

1.创建临时文件 mktemp 1.1 介绍 mktemp 命令用于创建并显示临时文件&#xff0c;可避免冲突 使用mktemp命令时&#xff0c;它会根据指定的模板在临时目录&#xff08;默认为/tmp&#xff09;中创建一个唯一的临时文件或目录&#xff0c;并返回该文件或目录的完整路径。临时…

在线UI设计工具有哪些?这5个包你满意

随着 UI 设计行业的蓬勃发展&#xff0c;越来越多的设计师进入 UI 设计&#xff0c;选择一款方便的 UI 设计工具尤为重要&#xff01;除了传统的 UI 设计工具&#xff0c;在线 UI 设计工具也受到越来越多设计师的青睐。这种不受时间、地点和计算机配置限制的工作方法真的很刺激…