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

浙公网安备 33010602011771号