C++ | 运算符重载

运算符重载

  • 在类中的函数进行重载(成员函数)

    运算符重载用于重新定义运算符的作用,使用函数名称 operatorOP作为函数名,其中OP为具体的运算符(如operator+

    class Time{
        Time operator+(const Time &t);
    };
    Time a, b;
    Time c = a + b;
    

    在成员函数中重载的运算符,如+ - 等,默认左边的操作数为当前对象,右边的操作数为函数参数。如上面代码中,a+b等价于a.operator+(b)

    而如果使用非成员函数重载+,则需要定义成operator+(const Time &a, const Time &b)

  • 大多数运算符也可以在类之外的函数重载,但下列运算符只能在成员函数中进行重载:

    • = :赋值运算符

    • ():函数调用运算符

    • []:下标运算符

    • ->:通过指针访问类成员的运算符

  • 使用 友元函数 进行运算符重载

    • 对于成员函数的运算符重载,运算符左边必须得是该对象,即:

      Obj a;							// a为Obj类的对象,假如Obj类有以下定义:
      double Obj::operator+(const double &v){ return a.value + v;}
      double x = a + 3.14;			// 等价为a.operator+(3.14);
      

      如果使用3.14 + a进行运算,则会报错,因为3.14不是一个Obj对象,没有operator+函数。

      这个时候,可以使用 友元函数 进行运算符重载。

    • 友元函数 --- 通过friend关键字,使得非成员函数具有类的成员函数一样的数据访问权限。

      class Obj{
          double value;
      public:
          // ...
          double operator+(double x){ return value + x;}
          friend double operator+(double x, const Obj &obj);
      };
      // 友元函数也可以是内联函数,即在类声明时定义
      // 如果在类声明之外定义函数,不需要加入 'Obj::' 和 'friend'
      double operator+(double x, const Obj &obj){ 
          return obj + x;			// 相当于return obj.operator+(x);
          					// 只需要将顺序颠倒,就可以使用上面的运算符重载函数
      }
      

      以上代码就解决了运算符重载时,第一个操作数不是该类对象的问题。

  • 使用友元函数对cout << {obj}进行重载

    • 要对<<进行重载,如果使用成员函数operator<<(ostream &o)进行重载,会变成:obj << cout;

    • 所以这时候需要调换其顺序,让ostream对象作为第一个操作数,这时候就可以使用上面的友元函数:

      class Obj{
          // ...
          // cout << ... 返回一个ostream对象
          // 这样便可以实现对cout的连续调用
          friend ostream& operator<<(ostream &o, const Obj &v){
              return o << v.value;
          }
      }
      
posted @ 2023-08-08 10:41  C111-CR  阅读(72)  评论(0)    收藏  举报