首先,什么是运算符重载?
C++里运算符重载主要有两种方法。一是通过类的成员函数进行重载,二是通过类的友元函数进行重载。
下面以简单的复数类complex为例:
下面是通过类的成员函数进行运算符的重载。
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 /*运算符重载可以通过类的成员函数和友元函数两种途径来实现*/ 6 7 class complex 8 { 9 public: 10 complex(int x=0,int y=0) 11 { 12 real = x; 13 image = y; 14 } 15 ~complex(){} 16 void show() 17 { 18 if(image >= 0) 19 cout<<real<<"+"<<image<<"i"<<endl; 20 else 21 cout<<real<<image<<"i"<<endl; 22 } 23 /*重载双目运算符*/ 24 complex operator +(const complex& a); 25 complex operator -(const complex& a); 26 /*重载单目运算符*/ 27 complex operator ++(); //原本为一个参数,但是少一个参数就没有参数了。 28 complex operator ++(int); 29 private: 30 int real,image; 31 }; 32 33 /*注意:以成员函数的形式来重载运算符,此时参数要比原本的参数少一个,因为在非静态成员函数中有this指针访问该对象*/ 34 /*但是如果是用友元函数来实现运算符重载,那么运算符函数的参数个数就是操作数的个数*/ 35 36 complex complex::operator +(const complex& a) 37 { 38 return complex(real+a.real,image+a.image); 39 } 40 41 complex complex::operator -(const complex& a) 42 { 43 complex c; 44 c.real = real - a.real; 45 c.image = image - a.image; 46 return c; 47 } 48 49 /*默认为不带参数为前置运算符,带参数int为后置运算符重载*/ 50 complex complex::operator ++() //前置++ 51 { 52 complex c; 53 real++; 54 image++; 55 c.real = real; 56 c.image = image; 57 return c; 58 } 59 60 complex complex::operator ++(int) //后置++ 61 { 62 complex c; 63 c.real = real; 64 c.image = image; 65 real++; 66 image++; 67 return c; 68 } 69 70 /*之前对为什么可以直接调用complex类型的对象的私有变量表示疑惑,我个人理解是可以在complex的成员函数中调用任何complex类的对象的私有变量*/ 71 72 int main() 73 { 74 complex a1(1,2); 75 complex a2(2,3); 76 complex c1,c2,c3,c4; 77 c1 = a1 + a2; 78 c2 = a1 - a2; 79 c3 = ++c1; 80 c4 = c2++; 81 c1.show(); 82 c2.show(); 83 c3.show(); 84 c4.show(); 85 return 0; 86 }
也可以通过友元函数来进行重载。比较懒,所以直接截MOOC上的图了。
通过以上的例子,简单的说明了运算符重载,帮助理解运算符的重载。
不过得注意,运算符重载有一些要求:
如果有错误,欢迎批评指正!