一.运算符重载基础

1.1 运算符重载的概念

运算符重载,就是赋予运算符新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,即”一名多用”,运算符重载也是相同的道理。
运算符重载有很多常见的应用,如加法运算符 ”+ ”对可以对整数、单精度数和双精度数进行加法运算,如5+8, 5.8 +3.67等,但是计算机底层对整数、单精度数和双精度数据的加法操作过程是很不相同的, 但C++对运算符”+ ”进行了重载,所以”+ ”能适用于int, float, doUble类型的混合运算。

1.2 一个运算符重载的例子:

Complex是用户自己定义的一种数据类型
现在要实现Complex c3 = c1 + c2;的操作,由于Complex是用户自定义类型,编译器根本不知道如何进行加减,只能使用函数实现相加功能,但是,C++提供了提供了一种机制,则可以实现使用“+”完成自定义类型相加的功能,这种机制就是运算符重载机制

//myAdd方式,可以实现两个Complex类型的数据相加的功能
Complex myAdd(Complex &c1, Complex &c2){Complex tmp(c1.a+ c2.a, c1.b + c2.b);return tmp;
}
//运算符重载
Complex operator+(Complex &c1, Complex &c2){Complex tmp(c1.a+ c2.a, c1.b + c2.b);return tmp;
}

在mian函数中,下面3条语句的能够实现相同的功能

Complex c3 = myAdd(c1, c2);
Complex c3 = operator+(c1, c2);
Complex c3 = c1 + c2;

1.3 运算符重载的本质:

根据上例可以看出:操作符重载的本质是通过函数扩展操作符的语义。
这个用来扩展操作符语义的函数被称为运算符重载函数,一个运算符被重载后,原有意义没有失去,只是定义了相对某一特定类的一个新运算符

1.4 运算符重载的限制条件:

1)不是所有运算符都是可以重载的,部分运算符不能重载

2)不能改变运算符的优先级
3)不能改变运算符的结核性
4)不能改变运算符所需要的操作数
5)不能创建新的运算符

二.运算符重载的使用

2.1 运算符重载的两种方式

对运算符进行重载时,一般有两种选择,可以使用成员函数或者非成员函数进行重载,这个非成员函数一般是友元函数,因为非成员函数中只有友元函数能访问类的私有数据,若进行运算符重载时使用到了类的私有数据,则只能用友元函数或成员函数
例如:对Complex类进行“+”运算符重载:

//方式一:使用友元函数
friend Complex operator+(Complex &c1, Complex &c2)
//方式二:使用成员函数
Complex operator-(Complex &c2)

友元函数进行运算符重载时所需的形参的数目与运算符使用的操作数数目相同,成员函数进行重载时则比友元函数重载少一个参数,原因是其中一个参数是被隐式地传递的调用对象

使用友元函数和成员函数进行重载的区别:

成员函数有this指针,所以成员函数可以隐式地传递参数,从而使参数比友元重载函数参数少一个。两种实现方式传递参数的方式不同,实现代码不同,应用场合也不同,但是达到的效果相同。

2.2 重载双目运算符:

注:下文使用op指代运算符
双目运算符:Object1 op Object2

方式一:成员函数

重载后调用方式实质:Object1.operator op(Object2 )
左参数由Object1对象通过this指针传递,右参数由参数Object2 对象传递

方式二:友元函数

重载后调用方式实质:operator op(Object1 ,Object2 )
左右参数由对象Object1和Object2传递

例子:对Complex类进行“+”运算符重载

//方式一:声明为成员函数
Complex operator+(Complex &c2)
//使用重载,两种方式等价
Complex c3 = c1.operator+(c2);
Complex c3 = c1 + c2; 
//方式二:声明为友元函数
friend Complex operator+(Complex &c1, Complex &c2)
//使用重载,两种方式等价
Complex c3 = operator+(c1, c2);
Complex c3 = c1 + c2; 

2.2 重载单目运算符:

单目运算符中,有一些运算符当位置不同时其含义不同,如“++”运算符和“–”运算符,i++表示先调用i然后i自增,++i表示i先自增然后再被调用。而其他运算符则没用这样的特性,如“.”运算符和“&”运算符
C++中通过占位参数来区分前置运算和后置运算

2.2.1 对位置固定的单目运算符的重载:

单目运算符:Object op 或 op Object

方式一:成员函数

重载后调用方式实质:Object.operator op( )
参数由Object对象通过this指针传递

方式二:友元函数

重载后调用方式实质:operator op(Object)
参数由对象Object传递

例子:对Complex类进行“&”运算符重载

//方式一:声明为成员函数
Complex operator&()
//使用重载,两种方式等价
Complex c3 = c1.operator&();
Complex c3 = &c1; 
//方式二:声明为友元函数
friend Complex operator+(Complex &c1)
//使用重载,两种方式等价
Complex c3 = operator&(c1);
Complex c3 = &c1; 

2.2.2 对位置不固定的单目运算符的重载:

运算符前置:op Objects

- 成员函数 友元函数
重载函数声明 Objects : : Objects operator op( ) Objects : : Objects operator op(Object &)
调用方式实质 Object.operator op( ) operator op(Object)

运算符后置:Objects op

运算符后置时重载函数要使用占位参数

- 成员函数 友元函数
重载函数声明 Objects : : Objects operator op(int) Objects : : Objects operator op(Object & ,int )
调用方式实质 Object.operator op(0) operator op(Object ,0)

C++基础语法-02-运算符重载相关推荐

  1. JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  2. Python基础--魔法方法()运算符重载)

    文章目录 Python基础--魔法方法()运算符重载) init方法 str方法 Python基础–魔法方法()运算符重载) init方法 class Cat:def hello(self):prin ...

  3. 第三次学JAVA再学不好就吃翔(part8)--基础语法之运算符

    学习笔记,仅供参考 文章目录 JAVA基础语法 运算符 逻辑运算符 逻辑运算符&&和&的区别 逻辑运算符||与|的区别 位运算符 &, |, ^, ~ 的用法 位异或运 ...

  4. 第三次学JAVA再学不好就吃翔(part7)--基础语法之运算符

    学习笔记,仅供参考 文章目录 JAVA基础语法 运算符 算数运算符 算术运算符 ++和-- 赋值运算符 关系运算符 JAVA基础语法 运算符 什么是运算符 就是对常量和变量进行操作的符号. 运算符的分 ...

  5. Python编程基础18:运算符重载

    文章目录 零.本讲学习目标 一.运算符重载概述 二.加法运算重载符 (一)概述 (二)案例演示 ( 三)课堂练习 三.索引与切片重载 (一)__getitem__方法 1.概述 2.方法代码 3.案例 ...

  6. python提供了两种基本的数值类型_6.Python基础语法---02基础数据类型

    基础数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需 ...

  7. java中怎样判断余数为3,Java的基础语法(三): 运算符

    7.运算符 定义: 对常量和变量进行操做的符号spa 分类: 6大类---算术, 赋值, 比较, 逻辑, 位, 三元code (1).算术运算符blog +, -, *, / ,%, ++, --字符 ...

  8. Python基础语法2 —— 运算符和优先级

    运算符 运算符的优先级问题 运算符 分类: 1.算数运算符 //取商 2.比较运算符 True/False 3.赋值运算符 = += -= = /= //= %= *= 4.逻辑运算符 and or ...

  9. JS基础语法(02)-JS的转义符

    转义符: \ 改变原来符号的作用就叫转义符 /*** 转义符: `\` 改变原来符号的作用就叫转义符* \" :输出双引号* \t:水平制表符,说人话就是多打几个空格* \n:换行符* \\ ...

  10. 寒假刷题实录-基础语法-02判断语句

    第二部分判断语句 6开头是题号 第二部分判断语句 020-665倍数 021-660零食 022-659区间 023-664三角形 024-667游戏时间 025-669加薪 026-670动物 02 ...

最新文章

  1. spring boot 加载过程分析(三)
  2. 终于明白如何去写原生AJAX
  3. 用姿态补偿雷达数据畸变的文字想法
  4. Windows 8部署系列PART7:配置MDT部署目标
  5. 物联网工程课程设计论文
  6. Java比较器-学习
  7. FlyMcu一键烧录STM32开发板时关于RTS和DTR电平方式的设置
  8. $.ajax+php实战教程之下拉时自动加载更多文章原理分析
  9. 云计算机房的建设预算,射阳高级中学云计算机房建设预算.doc
  10. PDF417数据容量
  11. VARCHART XGantt系列教程:甘特图调度程序探究
  12. oracle打开audit,oracle开启audit(审计)
  13. 锐龙R3-3300X和i5-9400f哪个好?
  14. 阿里云轻量级云服务器部署Java项目
  15. AI智能安防视频融合云平台EasyCVR分屏播放不能正常使用是什么原因?
  16. 一本通-1309-回文数
  17. html 让其中一个div浮在另一个div上面
  18. 124344534453
  19. 概率统计Python计算:用样本均值和方差计算总体参数的点估计
  20. 【渝粤教育】国家开放大学2018年春季 8616-21T食品营养卫生 参考试题

热门文章

  1. 谷粒商城:17.商城业务 — Nginx搭建域名访问
  2. 实战:使用python爬取新冠疫情国内外最新数据
  3. 实战Node:幼教平台幼教资源部分实现
  4. Vue:解决安装Vue Devtools报错Error: Cannot find module@vue-devtools/build-tools解决办法
  5. onClick,onServerClick,onClientClick
  6. JDBC中PreparedStatement接口的执行逻辑
  7. 斯坦福大学深度学习公开课cs231n学习笔记(6)神经网路输入数据预处理(归一化,PCA等)及参数初始化
  8. 视频+课件|基于多视图几何方式的三维重建
  9. 学习笔记 9.22 - 9.29
  10. Winfrom开发之动态生成TreeView树形菜单