【C++深度剖析教程8】C++的操作符重载的概念

之前学习了类的函数重载的概念,今天学习操作符重载的概念。在这之前我们先看一个例子:
这里写图片描述

上面是一个复数的加法,a为复数的实部,b为复数的虚部,在main函数里我想实现复数c1与c2的加法。很显然,正常的+号操作符是不能实现复数的相加减的。那么我们可以添加功能函数实现让两个复数的相加减的。代码如下:

#include <stdio.h>class Complex
{int a;int b;
public:Complex(int a = 0,int b = 0){this->a = a;this->b = b;}int getA(){return a;}int getB(){return b;}friend Complex Add(const Complex& p1,const Complex& p2);
};Complex Add(const Complex& p1,const Complex& p2)
{Complex ret;ret.a = p1.a + p2.a;ret.b = p1.b + p2.b;return ret;
}int main()
{Complex c1(1,2);Complex c2(3,4);Complex c3 = Add(c1,c2); //c1 + c2printf("c3.a = %d,c3.b = %d\n",c3.getA(),c3.getB());return 0;
}

打印如下:

c3.a = 4,c3.b = 6

说明程序实现了两个复数相加减的功能。
上面的Add函数解决了Complex对象的相加减的问题,但是Complex是现实世界中确实存在的复数,并且复数在数学中的地位与普通的实数相同。
为什么不能让 + 号这个操作符也支持复数相加呢?
由此我们你就想到了一个概念,操作符重载的概念:

  • C++中的重载能够扩展到操作符的功能
  • 操作符的重载以函数的方式进行

本质:

  • 用特殊形式的函数扩展操作符的功能

操作符重载的用法:

  • 通过operator关键字可以定义特殊函数
  • operator的本质是通过函数重载操作符

语法:

Type operator Sign(const Type& p1, const Type& p2)
{Type ret;return ret;
}

其中Sign为系统中预定义的操作符,如:+,- ,* ,/,等
将上面的程序改写为:

#include <stdio.h>class Complex
{int a;int b;
public:Complex(int a = 0,int b = 0){this->a = a;this->b = b;}int getA(){return a;}int getB(){return b;}friend Complex operator +(const Complex& p1,const Complex& p2);
};Complex operator +(const Complex& p1,const Complex& p2)
{Complex ret;ret.a = p1.a + p2.a;ret.b = p1.b + p2.b;return ret;
}int main()
{Complex c1(1,2);Complex c2(3,4);Complex c3 = c1 + c2; //operator +(c1,c2)printf("c3.a = %d,c3.b = %d\n",c3.getA(),c3.getB());return 0;
}

运行结果为:

c3.a = 4,c3.b = 6

这说明,我们的修改是对的,我们已经解决了这个复数相加的问题。

但是我们上述的程序都用到了友元的概念,但是友元一般不会出现在现代软件工程中。所以我们还可以改进:

  • 可以将操作符重载函数定义为类的成员函数
  • 比全局操作符重载函数少一个参数(左操作数)
  • 不需要依赖友元就可以实现操作符重载
  • 编译器优先在成员函数中寻找操作符重载函数

看如下代码:

#include <stdio.h>class Complex
{int a;int b;
public:Complex(int a = 0,int b = 0){this->a = a;this->b = b;}int getA(){return a;}int getB(){return b;}Complex operator +(const Complex& p){Complex ret;printf("Complex operator +(const Complex& p)\n");ret.a = this->a + p.a;ret.b = this->b + p.b;return ret;}friend Complex operator +(const Complex& p1,const Complex& p2);
};Complex operator +(const Complex& p1,const Complex& p2)
{Complex ret;printf("Complex operator +(const Complex& p1,const Complex& p2)\n");ret.a = p1.a + p2.a;ret.b = p1.b + p2.b;return ret;
}int main()
{Complex c1(1,2);Complex c2(3,4);Complex c3 = c1 + c2; //c1.operator + (c2)printf("c3.a = %d,c3.b = %d\n",c3.getA(),c3.getB());return 0;
}

运行结果为:

Complex operator +(const Complex& p)
c3.a = 4,c3.b = 6

分析运行结果以及程序:

运行结果打印的Complex operator +(const Complex& p),说明编译器优先在成员函数中寻找操作符重载函数,而没有选择全局变量中的重载函数。计算结果正常,说明可以将操作符重载函数定义为类的成员函数。
程序中类的成员重载函数Complex operator +(const Complex& p),只有一个参数,少一个参数。并且c1 + c2 等同于:c1.operator + (c2)。

总结:

  • 操作符重载是C++强大的特性之一
  • 操作符重载的本质是通过函数扩展操作符的功能
  • operator关键字是实现操作符的关键
  • 操作符重载遵循相同的函数重载法则
  • 全局函数和成员函数都可以实现对操作符的重载

想获得各种学习资源以及交流学习的加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

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

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

相关文章

大数据开发者应该知道的分布式系统 CAP 理论

无论你是一个系统架构师&#xff0c;还是一个普通开发&#xff0c;当你开发或者设计一个分布式系统的时候&#xff0c;CAP理论是无论如何也绕不过去的。本文就来介绍一下到底什么是CAP理论&#xff0c;如何证明CAP理论&#xff0c;以及CAP的权衡问题。 CAP理论概述 CAP理论&a…

【C++深度剖析教程11】C++学习之编写代码实现复数类

今天&#xff0c;我来学习将复数的加减乘除以及比较运算&#xff0c;编写一个复数类&#xff0c;方便计算复数之间的运算。具体用的方法就是之前写过的操作符重载的概念来实现&#xff08;操作符重载的概念学习&#xff09;。 那么为了显得清晰&#xff0c;今天写的程序运用模块…

IT餐馆—第二十五回 结对

周五开会时&#xff0c;有人提出在团队中采用结对开发的Agile实践。 当然团队里有人说&#xff0c;如果让新手与水平高的人结对&#xff0c;基本上就是知识的单向传递了&#xff0c;对于新手来说的确是个不错的学习机会&#xff0c;但对于水平高的开发者&#xff0c;就未必不乐…

Spring Cloud各组件总结归纳

前面介绍了很多Spring Cloud的组件&#xff0c;本篇按照自己的角度来做一次归纳。 Spring Cloud技术应用从场景上可以分为两大类&#xff1a;润物无声类和独挑大梁类。 润物无声&#xff0c;融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon&#xff0c;客户端负载均…

移植Linux系统到iMX6开发板之LVDS显示屏驱动程序的框架分析与移植

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录一下项目中的关于LVDS显示屏的驱动程序的分析与移植。因为驱动源码厂家已经提供好&#xff0c;我们需要做的就是读懂驱动程序的代码&#xff…

Java api 1.8 中文 帮助文档

java 1.6 帮助文档 中文 链接&#xff1a;http://download.csdn.net/detail/qw599186875/9608735 英文 Java1.8 帮助文档 英文 中文 – 谷歌版 在线版: https://blog.fondme.cn/apidoc/jdk-1.8-google/下载链接&#xff1a;http://download.csdn.net/detail/qw599186875/980219…

设计模式记--Observer Pattern观察者模式

观察者模式——定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对像改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新. 从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需要有发布者(Publish),也可称为被观察的目标 (…

前端学习(64):css继承属性小结

今天来总结一点关于css中哪些属性可以被继承&#xff0c;哪些不可以被继承。不是很全&#xff0c;仅供大家参考&#xff0c;也方便于自己以后复习。 一、不能被继承的属性 1、display&#xff1a;规定元素应该生成的框的类型 2、文本属性&#xff1a; vertical-align、 text…

iMX6开发板移植Linux系统之LVDS显示屏驱动程序分析之LVDS参数的匹配过程分析

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇分析LVDS驱动程序移植过程的文章&#xff08;文章链接为&#xff1a;移植Linux系统到iMX6开发板之LVDS显示屏驱动程序的框架分析与移植&#xf…

日常spoken英语学习

今天遇到一个老外&#xff0c;说&#xff1a;can you speak engilsh dou you know coffee in here 我是想了半天&#xff0c;第一有点蒙&#xff0c;第二确实忘了&#xff0c;咖啡馆在哪了&#xff0c;回了一句&#xff1a;Iam think 感觉不知道如何组织语言了&#xff0c;口…

【C++深度剖析教程9】初探C++标准库

在这之前&#xff0c;我写的C程序不能叫做标准的C程序&#xff0c;因为里面写的大多数还带有C语言的影子。今天我们来学习C标准库。 首先看一下例子&#xff1a;操作符<<的原生意义是按位左移。那么我们重载这个操作符&#xff0c;将变量或者常量&#xff0c;左移到一个…

Quartus II常见问题集锦

1、 【问题】Pin Planner 的使用问题&#xff1a;在QuartusII 7.2 &#xff0c;时序仿真都通过&#xff0c;但是&#xff0c;一旦使用Pin Planner设定引脚后&#xff0c;时序仿真就发生变化&#xff0c;与功能仿真结果不一致&#xff0c;不是理想的结果。使用Pin Planner时要注…

员工考核UI网页界面(PS大屏文件资料)

现分享人员管理可视化数据统计网页UI、员工考核数据可视化UI网页界面模版的UI源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作。 若需更多 大屏组件&#xff0c;请移步小7的另一篇文章&#xff1a;数据可视化大屏组件&#xff0c;大屏PSD设计源文件(大屏UI设计规范)…

【C++深度剖析教程10】C++中的字符串类

首先我们看看C语言&#xff1a; C语言不支持真正意义上的字符串C语言用字符数组和一组函数实现字符串操作语言不支持自定义类型&#xff0c;一次无法获得字符串类型 从C到C中的进化过程中引入了自定义类型 在C中&#xff0c;可以通过类完成字符串类型的定义 C标准库提供了st…

docker 使用中遇到的问题

1.执行docker run hello 命令建立镜像过程中报错 开始以为是加速器的问题&#xff0c;将/etc/docker/daemon.json 文件删除还是不行 后来执行了这两条命令&#xff1a;就不报错了如下图&#xff1a; systemctl daemon-reloadsystemctl restart docker.service 参考&#xff1…

广州技术沙龙第 2、3 期参会者twitter、blog、兴趣大合集

随着组织者越来越有经验&#xff0c;我们在第 2、3 期报名的时候&#xff0c;让参会者填上自己的 twitter、blog和兴趣方向&#xff0c;为的就是让大家方便地找到与自己志同道合的朋友&#xff0c;今天推出第一个合集&#xff0c;祝大家找到新朋友。 注&#xff1a;twitter 账号…

maven 解决冲突

1.Maven之jar包冲突解决&#xff08;理解maven 产生冲突的原因&#xff09; 导致jar包冲突的原因 1、mvn的传递依赖特性&#xff1a;mvn编译打包除了会引入直接申明的依赖&#xff0c;还会引入间接申明的依赖 2、mvn的依赖仲裁规则&#xff1a; 1&#xff09;. 按照项目总控P…

jz2440开发板修改UBOOT支持NAND FLASH

很多天没有看嵌入式的东西了&#xff0c;今天来看一下&#xff0c;继续之前移植uboot到jz2440开发板。今天我们来实现Uboot支持NAND FLASH。 在之前的文章里&#xff08;点击连接查看之前的记录&#xff09;&#xff0c;我们为了编译通过把NAND FLASH 给屏蔽掉了&#xff0c;现…

i.MX6网卡驱动程序fec.c的分析(AR8035网卡驱动程序的详细分析)之一

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 因为做的项目需要用到ethercat主站&#xff0c;而用ethercat主站&#xff0c;标准的网卡网络协议栈性能就无法达到要求&#xff0c;需要根据ethercat官…

TOAD常用快捷键

现在在企业中&#xff0c;操作oracle数据库的客户端&#xff0c;除了PL/SQL外&#xff0c;使用的较多的就是TOAD了&#xff01; 为此&#xff0c;我在网上搜索了下&#xff0c;整理了些简单TOAD的使用技巧&#xff0c;现分享给大家。 常用快捷键&#xff1a; F8 调出以前执行的…