算法训练补充c++知识点:运算符重载

补充c++知识点:运算符重载
  1. 由于自己重载运算符时,不明白为什么要那么做,有时会弄错,所以补一下知识点。

  2. 简介:

    运算符重载只是一种“语法上的方便”,也就是说他只是另一种函数调用的方式。其中不同之处在于函数的参数不是出现在圆括号之内,而是紧贴在一些字符旁边,这些字符我们一般认为是不可变的运算符。

    运算符的使用和普通的函数调用有两点不同。首先是语法上的不同,“调用”运算符时要把运算符放在参数之间,有时在参数之后。第二个不同是由编译器决定调用哪一个“函数”。例如,如果对参数为浮点型使用+运算符,编译器或“调用”执行浮点类型加法的函数(这种调用通常是插入内联代码,或者一段浮点处理器指令)。

    在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通函数的定义,只是函数的名字由关键字operator及其后紧跟的运算符组成。差别仅此而已。他像其它函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。

  3. 语法:

    定义重载的运算符就像定义函数,只是该函数的名称是operator@, 这里@表示被重载的运算符。函数参数中的参数个数取决于两个因素:

    1. 运算符是一元的(一个参数)还是二元的(两个参数)。
      1. 运算符被定义为全局函数(对于一元是一个参数,对于二元是两个参数),还是成员函数(对于一元没有参数,对于二元是一个参数——此时该类的对象用左侧参数)。
      2. 几个运算符重载的例子:
    //一元运算符重载
    const Integer& operator-(const Integer& a){
          
          //全局函数的形式
        return Integer(-a.i);
    }
    const Byte operator-() const {
          
          //成员函数的形式,写在一个对象的内部,作为成员方法
        return Byte(-this.b);
    }
    const Integer& operator++(Integer &a){
          
          //全局形式,实现++a;
        a.i++;
        return a;
    }
    const Integet& operator++(Integer &a, int){
          
          //全局形式实现a++;
        Integer before(a.i);
        a.i++;
        return before;
    }
    //二元运算符重载
    int operator<(const Integer& left, const Integer& right){
          
          //全局形式
    			return left.i < right.i;
    }
    int operatot<(const Byte& right)const{
          
          //成员方法形式,放在一个类中
        return this.b < right.b;
    }
    Byte& operator=(const Byte& right){
          
           // 对赋值运算符的重载,其只能作为成员方法的形式进行重载。
        if(this == &right)return *this;
        this.b = right.b;
        return *this;
    }
    Integer& operator+=(Integer& left, const Integer& right){
          
          //注意对左值是非常量引用
        left.i += right.i;
        return left;
    }
    
    1. 参数和返回值:

      在上面的几个例子中,见到不同的参数传递和返回方法,它们遵守一种呵护逻辑的模式,我们在大部分情况下都应该选择这种模式:

      1. 对于任何函数参数,如果仅需要从参数中读而不改变它,默认应当作为const来引用传递它。例如普通运算符和不二运算符不会改变参数本身,所以用const来引用传递,而自增自减会改变参数本身,不能用const传递。
      2. 返回值的参数类型,取决于运算符号的具体含义(我们可以对参数和返回值做任何想做的事)。
      3. 所有赋值运算符均改变左值,所以为了方便,所有赋值运算符的返回值对于左值应该是非常量引用。
      4. 对于逻辑运算符,人们希望至少得到一个int返回值,最好是bool返回值。

猜你喜欢

转载自blog.csdn.net/qq_40596572/article/details/104880538