zoukankan      html  css  js  c++  java
  • C++中操作符函数

    一、操作符函数
    在C++中,编译器有能力把一个由数据、对象和操作符共同组成的表达式,解释为对一个全局或成员函数的调用。
    该全局或成员函数被称为操作符函数,通过重定义操作符函数,可以实现针对自定义类型的运算法则,并使之与内置类型一样参与各种表达式。

    二、双目操作符表达式
    成员函数
    形如L#R双目操作符表达式,将被编译器解释为 L.operator#(R)
    a-b+c == a.operator-(b).operator+(c)
    全局函数
    形如L#R的双目操作符表达式,将被编译器解释为 ::operator#(L,R)
    a-(b+c) == ::operator-(a,::operator+(b,c))

    三、单目操作符表达式
    成员函数
    形如#O或O#的单目操作表达式,将被编译器解释为 O.operator#(),唯一的操作数是调用对象。
    全局函数
    形如#O或O#的单目操作表达式,将被编译器解释为 ::operator#(O),唯一的操作数是调用对象。

    四、典型的双目运算符重载
    成员函数
    Point operator /+-*%|^& (Point& that)
    {
      Point t; // 会调用无参构造
      t.x = x / that.x;
      t.y = y / that.y;
    return t; // 不能返回局部对象的引用,否则会出现悬空引用
    }
    注意:原对象的值不变,要产生一个临时的对象

    bool operator > < >= <= == != || && (Point& that)
    {

    }

    Point& operator += -= *= /= (Point& that)
    {

      return *this;
    }

    注意:运算符的重载要符合情理。

    全局函数
    可能会访问到参数的私有成员:
    1、把成员变成公开,但会破坏类的封闭性。
    2、把全局函数声明为友元(友元不是成员),
    3、不能在友元函数中直接访问成员变量。
    Point operator + (Point& a,Point& b)
    {
      Point t(a.x+b.x,a.y+b.y);
      return t;
    }

    五、典型的单目运算符重载
    成员函数:
    前++/--
    Point& operator ++/-- (void)
    {

    }

    后++/--
    Point operator ++/-- (int)
    {

    }

    全局函数:
    前++/--
    Point& operator ++/-- (Point&)
    {

    }

    后++/--
    Point operator ++/-- (Point&,int)
    {

    }

    六、输入、输出运算符重载
    输入、输出运算符不能重载为成员函数,只能是友元。
    ostream& operator << (ostream& os,Point& p)
    {

    }

    istream& operator >> (istream& is,Point& p)
    {

    }

    七、特殊的运算符的重载
    [] 下标运算符,可以把对象当作数组来使用。
    () 函数运算符,可以把对象当作函数来使用。
    -> 成员访问运算符,可以把对象当作指针来使用。
    * 解引用运算符,可以把对象当作指针来使用。
    new/delete 也可以进行重载,但不建议使用。
    new会自动调用重载的new函数再构造函数。
    delete会先调用析构再调用重载的delete函数。

    只有极个别的运算符的重载对于对象来说是有意义(>>,<<)

    八、运算符重载的一些限制
    1、不能重载的运算符
    :: 作用域限定符
    . 成员访问运算
    .* 成员指针解引用
    ?: 三目运算符
    sizeof 字节长度运算符
    typeid 类型信息操作符
    2、运算符的重载改变不了运算符的优先级
    3、无法改变运算符的操作个数
    4、无法发明新的运算符
    5、重载运算符要注意运算符的一致性
    不要改变运算符默认的运算规则
    6、运算符的重载是为了方便使用、增强可读,不应该成功卖弄的工具。


  • 相关阅读:
    QSet使用及Qt自定义类型使用QHash等算法
    QQueue与QStack使用
    QHash和QMultiHash使用
    【洛谷6633】[ZJOI2020] 抽卡(多项式毒瘤题)
    【洛谷5996】[PA2014] Muzeum(模拟费用流)
    【CF1063F】String Journey(后缀自动机+线段树)
    【BZOJ3640】JC的小苹果(高斯消元)
    【洛谷6478】[NOI Online #2 提高组] 游戏(树形DP+二项式反演)
    【洛谷6730】[WC2020] 猜数游戏(数论)
    【洛谷6186】[NOI Online #1 提高组] 冒泡排序(树状数组)
  • 原文地址:https://www.cnblogs.com/xiwen2017/p/9451227.html
Copyright © 2011-2022 走看看