zoukankan      html  css  js  c++  java
  • C++中的运算符重载

    系统给我们提供了很多运算符,但很多时候仍旧满足不了我们的需求,特别是当我处理自定义类型的时候,系统提供的运算符的功能就不够用了,这时候我们就用到了运算符重载。

     

    运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。换句话说,运算符重载实质上是函数的重载。

     

    C++当中的大部分运算符都可以进行重载,但也有几个运算符不允许我们进行重载

    不能重载的运算符只有5个: 
    (1) 成员访问运算符.
    (2) 作用域运算符∷
    (3) 条件运算符?:
    (4) 成员指针运算符*
    (5) 编译预处理命令的开始符号#

    另外还需要注意以下几点:

    • C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。也就是说只能重载内置的 + - * / 等运算符,不能自己创造运算符计算。 
    • 重载不能改变运算符运算对象(即操作数)的个数。比如+运算符,那么它有两个操作数,当我们重载它的时候 也只能有两个操作数 。
    • 重载不能改变运算符的优先级别。
    • 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3)点矛盾。
    • 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。
    • 用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&”不必用户重载。
      ① 赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。
      ② 地址运算符&也不必重载,它能返回类对象在内存中的起始地址。

    总之,当C++语言原有的一个运算符被重载之后,它原先所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符。
    运算符重载可以使用成员函数和友元函数两种形式。

    可以参考以下的经验:

    1. 只能使用成员函数重载的运算符有:=、()、[]、->、new、delete。
    2. 单目运算符最好重载为成员函数。
    3. 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建议重载为成员函数。
    4. 对于其它运算符,建议重载为友元函数。

    那么我们如何进行运算符重载呢?

    方法很简单,定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。

    重载运算符的函数一般格式如下: 
    函数类型 operator 运算符名称 (形参表列)

       对运算符的重载处理
    }

    注意:

    • 重载为类成员函数时参数个数=原操作数个数-1(后置++、--除外):当重载为类成员函数时,参数个数等于原来的操作数-1 。比如 对象a +对象b   我们重载的时候需要两个操作数a和b但我们传递过去一个就可以了,比如 a+b 我们只需要把b传递过去就可以了。因为当调用重载运算符时,就是a调用的重载运算符,那么它就是当前对象,它就是这时的this 指针,而且类成员函数只能使用两个类中成员
    • 重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。与上面没多大区别,但它却可以调用非类中对象,比如调用一个对象a+1 需要注意的是即使定义为友元函数,它的操作数也必须有一个为自定义类型。

    作者:耑新新,发布于  博客园

    转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

  • 相关阅读:
    [转载]项目风险管理七种武器之引言
    [转载]基于TFS实践敏捷-Scrum模式运用
    [转载]基于TFS实践敏捷-工作项跟踪
    [转载]TFS入门指南
    SVN — subclipse操作指引
    Java 中 方法名或类名 变更 同时 更新 所有引用的 类名或方法名 的解决方案
    Java import javax.servlet 出错
    java 中 SVN 设置所有文件及子目录 needs-lock, svn 提交时自动设置 needs-lock, 及版本不一致问题
    vmware 传输(vmdb)错误-32:pipe:read failed 解决方法
    Web.xml配置详解
  • 原文地址:https://www.cnblogs.com/Arthurian/p/6099372.html
Copyright © 2011-2022 走看看