运算符重载是通过函数重载实现的,下面我们来介绍一下运算符重载需要遵循的规则。

1 并不是所有的运算符都可以重载。能够重载的运算符包括:

+  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |=  <<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  []  new  new[]  delete  delete[]

上述运算符中,[]是下标运算符,()是函数调用运算符。自增自减运算符的前置和后置形式都可以重载。长度运算符sizeof、条件运算符: ?、成员选择符.和域解析运算符::不能被重载。

2 重载不能改变运算符的优先级和结合性。假设上一节的 complex 类中重载了+号和*号,并且 c1、c2、c3、c4 都是 complex 类的对象,那么下面的语句:

c4 = c1 + c2 * c3;

等价于:

c4 = c1 + ( c2 * c3 );

乘法的优先级仍然高于加法,并且它们仍然是二元运算符。

3 重载不会改变运算符的用法,原有几个操作数、操作数在左边还是在右边,这些都不会改变。例如~号右边只有一个操作数,+号总是出现在两个操作数之间,重载后也必须如此。

4 运算符重载函数不能有默认的参数,否则就改变了运算符操作数的个数,这显然是错误的。

5 运算符重载函数既可以作为类的成员函数,也可以作为全局函数。

将运算符重载函数作为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数。之所以少一个参数,是因为这个参数是隐含的

complex 类中重载了加法运算符:

complex operator+(const complex & A) const;

当执行:

c3 = c1 + c2;

会被转换为:

c3 = c1.operator+(c2);

通过 this 指针隐式的访问 c1 的成员变量。

将运算符重载函数作为全局函数时,二元操作符就需要两个参数,一元操作符需要一个参数,而且其中必须有一个参数是对象,好让编译器区分这是程序员自定义的运算符,防止程序员修改用于内置类型的运算符的性质。

如果有两个参数,这两个参数可以都是对象,也可以一个是对象,一个是C ++内置类型的数据,例如:

complex operator+(int a, complex &c){return complex(a+c.real, c.imag);
}

它的作用是使一个整数和一个复数相加。

另外,将运算符重载函数作为全局函数时,一般都需要在类中将该函数声明为友元函数。原因很简单,该函数大部分情况下都需要使用类的 private 成员。

上节的最后一个例子中,我们在全局范围内重载了+号,并在 complex 类中将运算符重载函数声明为友元函数,因为该函数使用到了 complex 类的 m_real 和 m_imag 两个成员变量,它们都是 private 属性的,默认不能在类的外部访问。

6 箭头运算符->、下标运算符[ ]、函数调用运算符( )、赋值运算符=只能以成员函数的形式重载。

C++ 运算符重载规则相关推荐

  1. (P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则

    文章目录 1.运算符重载 2.成员函数重载 3.非成员函数重载 4.运算符重载规则 1.运算符重载 运算符重载允许把标准运算符(如+.-.*./.<.>等)应用于自定义数据类型的对象 直观 ...

  2. c++重载(以运算符重载为主)

    重载(OverLoading)是面向对象程序设计多态性的一种体现.所谓重载,是指"同一标识符"在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符.也就是说,重载可 ...

  3. C++运算符重载(成员函数方式)

    一.运算符重载 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.如果将C++中这些现存的运算符直接作用于用户自定义的类型数据上,会得到什么样 ...

  4. C++运算符重载讲解与经典实例

    转自:http://blog.csdn.net/dingyuanpu/article/details/5852825 C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型 ...

  5. Part8 多态性 8.1运算符重载

    1运算符重载的规则 C++ 几乎可以重载全部的运算符,而且只能够重载C++中已经有的. 不能重载的运算符:".".".*"."::".&qu ...

  6. C++学习笔记(九)——运算符重载

    C++学习笔记(九)--运算符重载 C++内部定义的数据类型(int , float, -)的数据操作可以用运算符号来表示,其使用形式是表达式:用户自定义的类型的数据的操作则用函数表示,其使用形式是函 ...

  7. C++知识总结——运算符重载

    C++知识总结--运算符重载 3.运算符重载 3.1运算符重载概念 3.2运算符重载规则 3.3运算符重载形式 3.运算符重载 3.1运算符重载概念   C++中预定义的运算符的操作对象只能是基本数据 ...

  8. 【带你吃透C++】运算符重载(赋值运算符重载)原来是这么一回事

    look here 运算符重载 赋值运算符重载 细节总结: – the End – 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,其目的就是让自定义类型可以 ...

  9. C++运算符重载详解

    目录 什么是运算符重载 运算符重载的意义 运算符重载的语法格式 简单例子 "+"运算符的重载 代码分析 运算符重载的两种方式 1,重载为类的成员函数 (1),双目运算符 (2),单 ...

最新文章

  1. Commonly Hacked Ports
  2. 【题解】SDOI2008莎拉公主的困惑
  3. PS教程第二十课:有了选区就有了界限
  4. jlist动态添加元素后刷新_小米电视5再曝光:MEMC动态画质补偿技术
  5. 深度学习入门(一):LeNet-5教程与详解
  6. 贝壳找房的深度学习模型迭代及算法优化
  7. 【译】EntityFramework6与EntityFrameworkCore的区别
  8. 检查库文件的rpath命令
  9. 用python画箱线图_python绘制箱线图
  10. 三菱f800变频器 频率设定_三菱plc和变频器通讯怎么设置频率
  11. 自建 CA 中心并签发 CA 证书
  12. 微信朋友圈两大神秘江湖帮派:养生党、鸡汤党
  13. 相机对焦、标定等近期学习
  14. 简单算法一个(有N个人,依照顺序报123,数到3的人自动出局,问最后剩下的那个人在原来的队列中排第几)
  15. 《经典算法》数独问题
  16. 初学51单片机制作智能小车心得
  17. 钉钉在线课程开启屏幕共享时电脑蓝屏问题解决办法
  18. c++中CreateEvent函数
  19. matlab如何将三维转为二维_matlab三维矩阵怎么转为二维矩阵?
  20. typeScript学习笔记day01——小肉包

热门文章

  1. Win11系统使用Excel表格的时候很卡怎么办
  2. Win11系统点击回滚没有反应是怎么回事
  3. 深度技术Win11 64位最新旗舰版镜像V2021.08
  4. win7系统开机蓝屏提示hardware Monitor的解决方法
  5. jeecg <t:choose 功能标签用法修改 处理选择0条记录回写
  6. myEclipse背景控制插件方案 内附使用说明
  7. springMVCs下载
  8. cv2 imwrite中文路径_python3下使用cv2.imwrite存储带有中文路径图片的方法
  9. java中字典算法_Java字典生成算法讲解
  10. SpringBoot默认日志logback配置解析