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;    
        }

    这也是2大类双目运算符重载形式。注意点是:运算符的重载是要符合情理的。

    全局函数
     可能会访问到参数的私有成员:
      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)
    {
        return os << "x=" << p.x << "," << "y=" << p.y ;
    }
    
    istream& operator >> (istream& is,Point& p)
    {
        return is >> p.x >> p.y;   
    }

    friend ostream& operator << (ostream& os,Point& p);
     friend istream& operator >> (istream& is,Point& p);

    输入、输出运算符是需要友元函数声明的。

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

    八、运算符重载的一些限制
     1、不能重载的运算符
      :: 作用域限定符
      . 成员访问运算
      .* 成员指针解引用
      ?: 三目运算符
      sizeof 字节长度运算符
      typeid 类型信息操作符
     2、运算符的重载改变不了运算符的优先级
     3、无法改变运算符的操作个数
     4、无法发明新的运算符
     5、重载运算符要注意运算符的一致性
      不要改变运算符默认的运算规则

     
     
     
     
     
     
     
  • 相关阅读:
    vs2010启动调试很慢
    vs2010 cannot file the PDB file解决
    hadoop的版本到底什么样子
    关于spring 或者qurtz的配置
    eclipse 关于内嵌maven
    spring学习 mark一下
    spring mvc视图解析
    rcp项目
    邮件发送
    ASP.NET 缓存学习
  • 原文地址:https://www.cnblogs.com/yyc954330712/p/9451177.html
Copyright © 2011-2022 走看看