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

  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/Arthurian/p/6099372.html
Copyright © 2011-2022 走看看