一.C++中运算符重载需要遵循的规则

  • 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的成员变量
      
    • 将运算符重载函数作为全局函数时,二元操作符就需要两个参数,一元操作符需要一个参数,而且其中必须有一个参数是对象,好让编译器区分这是程序员自定义的运算符,防止程序员修改用于内置类型的运算符的性质。
      • 例如,下面这样是不对的:

            int operator+ (int a,int b){return (a-b);}
        
      • +号原来是对两个数相加,现在企图通过重载使它的作用改为两个数相减, 如果允许这样重载的话,那么表达式4+3的结果是 7 还是 1 呢?显然,这是绝对禁止的。
    • 如果有两个参数,这两个参数可以都是对象,也可以一个是对象,一个是C++内置类型的数据,例如:
          complex operator+(int a, complex &c){return complex(a+c.real, c.imag);}
      
    • 另外,将运算符重载函数作为全局函数时,一般都需要在类中将该函数声明为友元函数。原因很简单,该函数大部分情况下都需要使用类的private成员。
  • 6.箭头运算符->、下标运算符[ ]、函数调用运算符( )、赋值运算符=只能以成员函数的形式重载

C++中运算符重载需要遵循的规则相关推荐

  1. c++中运算符重载方式中你易遗漏的小细节

    运算符重载函数相当于类来说有两种存在方式: 1.重载为类的成员函数. 2.重载为类的友元函数. 重载为类的成员函数. 如果把运算符重载为类的成员函数,则该函数么须通过对象调用,该对象就是运算符的其中一 ...

  2. 关于c++中运算符重载

    通俗的讲,运算符重载就是把运算符赋予新的功能,比如说 + 有整数相加 浮点数相加的功能,但是没有复数相加的功能,这时我们通过运算符重载,使得 + 具有复数相加的功能,这就叫做运算符重载,本质上, 运算 ...

  3. c++中运算符重载(加号运算,左移运算,前置后置++运算符,赋值运算,关系运算,函数运算)

    运算符重载注意 重载的运算符要易读 内置的数据类型的表达式的运算符是不可以改变的 不要重载&& 和 | | 运算符 =,[]和->运算符只能通过成员函数进行重载 << ...

  4. 【C++面向对象】C++中运算符重载的两种方式

    我们知道在C++中可以通过重载运算符的方式,使类实现类似于基本类型的运算符操作,如+.-.*./等等.本文介绍这种重载运算符的两种方法. 我们先自定义一个类,来作为本次研究的对象: class Int ...

  5. c++中 运算符重载 const 函数

    概要 本篇文章主要内容是关于运算符重载,然后在最后提了一下 const修饰函数时的状况.后面会补上一个日期类的定义. 文章目录 概要 赋值运算符的重载 = 号的重载 i++ 和 ++i 前置与后置++ ...

  6. C++中运算符重载的方法

    **#include<iostream> using namespace std; class Complex{ public:Complex(){real=0;imag=0;}Compl ...

  7. [YTU]_2384 ( 矩形类中运算符重载【C++】)

    题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩 ...

  8. [YTU]_2384( 矩形类中运算符重载【C++】)

    定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动.两个矩形相加的规则 ...

  9. C++ 运算符重载规则

    运算符重载是通过函数重载实现的,下面我们来介绍一下运算符重载需要遵循的规则. 1 并不是所有的运算符都可以重载.能够重载的运算符包括: + - * / % ^ & | ~ ! = < & ...

最新文章

  1. 计算机输入输出有哪几种控制方式,计算机输入/输出的方式有哪几种?
  2. redis怎么不让存byte_redis用bitfield存储的问题
  3. B-监狱逃脱(BFS)
  4. (转)HIBERNATE与 MYBATIS的对比
  5. linux 查看语言环境_Linux语言环境版本查看shell脚本
  6. 国家智能计算机研究开发中心 地址,油藏数值模拟-国家智能计算机研究开发中心.PDF...
  7. 猪的诱惑(2005-12-25 15:45:05)(新浪)
  8. GDCM:gdcm::Dicts的测试程序
  9. 具备安全态势感知能力的安全管理平台
  10. 针对新手的Java EE7和Maven项目–第7部分
  11. Zookeeper——一致性协议:Zab协议
  12. 小程序table 表格+小程序table 表格太长显示不全,实现滚动效果
  13. 根据某个字段判断是否添加条件
  14. mysql_day02创建数据表
  15. 关于自走棋类游戏棋子搜索算法分析
  16. PLC可编程控制器、单片机开发应用及变频调速综合实训装置
  17. cmd批处理的/d/l/r/f
  18. 七夕节 看到许多停止更新的blog 莫名有点淡淡的忧桑
  19. 如何比较好的规避拼多多纠纷退款的技巧?天创速盈来说
  20. 996的大公司和965的小公司,你怎么选?

热门文章

  1. Spring+MybatisPlus实现多数据源
  2. 《SAP FIORI 开发入门》课程答疑 第二期
  3. 《数据分析变革:大数据时代精准决策之道》一导读
  4. MongoDB 维护Replica Set
  5. Mac上搭建直播服务器Nginx+rtmp
  6. shiro源码分析(四)具体的Realm
  7. [物理学与PDEs]第2章第5节 一维流体力学方程组的 Lagrange 形式 5.1 引言
  8. JS和JSP之间值传递
  9. jQueryUI Repeater 无刷新删除 新建 更新数据 - JQueryElement [7]
  10. SQL Servr 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性