二十 操作符重载 eg:复数x+yi 3+4i (1+2i) + (3+4i) = 4+6i 1 双目操作符(L # R) 1.1 运算类的双目操作符:+ - * / -->左右操作数可以是左值也可以是右值 -->表达式结果是右值 1)成员函数形式 L#R的表达式会被编译器自动处理为L.operator#(R)的成员函数调用,该函数的返回值即为表达式的值。 2)全局函数形式 L#R的表达式会被编译器自动处理为operator#(L,R)的全局函数调用,该函数的返回值即为表达式的值。 注:通过friend关键字,可以把一个全局函数声明为某个类的友元,友元函数可以访问类中的任何成员。 1.2 赋值类的双目操作符 -->左操作数是左值(不能是常量),右操作数可以是左值也可以是右值 -->表达式结果是左值,就是左操作的自身 1)成员函数形式: L # R --》L.operator#(R); 2)全局函数形式: L # R --》operator#(L,R); -------------------- 2 单目操作符重载 #O 2.1 计算类单目操作符:-(取负) ~ ! -->操作数可以左值也可以值右值 -->表达式结果是一个右值 1)成员函数形式 #O --》O.operator#(); 2)全局函数形式 #O --》operator#(O); 2.2 自增减单目操作符: ++/-- 1)前缀自增减 --》操作数是左值 --》表达式结果就是操作数自身,也是左值 成员函数形式: #O--> O.operator#() 全局函数形式: #O--> operator#(O) 2)后缀自增减 --》操作数是左值 --》表达式结果是自增减之前的副本(右值) 成员函数形式: O#--> O.operator#(int/*哑元*/) 全局函数形式: O#--> operator#(O,int/*哑元*/) --------------------------- 3 插入和提取操作符: << >> 功能:实现自定义类型的输入和输出的功能 注:只能用全局函数形式 #include <iostream> ostream cout; istream cin; cout << a;//operator<<(cout,a); friend ostream& operator<<( ostream& os,const RIGHT& right){...} cin >> a;//operator>>(cin,a); friend istream& operator>>( istream& is,RIGHT& right); ========================================== 练习:实现3x3矩阵类,支持如下操作符重载 << + - += -= -(取负) ++(前后) --(前后) 要求:除了<<,都使用成员函数形式 class M33{ public: M33(void){ for(int i=0;i<3;i++) for(int j=0;j<3;j++) m_a[i][j] = 0; } M33(int a[][3]){ for(int i=0;i<3;i++) for(int j=0;j<3;j++) m_a[i][j] = a[i][j]; } const M33 operator+(const M33& m)const{ int a[3][3]={0}; for(int i=0;i<3;i++) for(int j=0;j<3;j++) a[i][j]= m_a[i][j] + m.m_a[i][j]; M33 res(a); return res; } private: int m_a[3][3]; }; int main(void) { int a1[3][3] = {1,2,3,4,5,6,7,8,9}; int a2[3][3] = {9,8,7,6,5,4,3,2,1}; M33 m1(a1); M33 m2(a2); } m1 + m2 1 2 3 9 8 7 10 10 10 4 5 6 + 6 5 4 = 10 10 10 7 8 9 3 2 1 10 10 10 ------- m1 - m2 1 2 3 9 8 7 -8 -6 -4 4 5 6 - 6 5 4 = 2 0 2 7 8 9 3 2 1 4 6 8 4 new/delete 操作符 static void* operator new(size_t size){...} static void operator delete(void* p){...} 5 函数操作符"()" 6 下标操作符"[]"