我们知道,C++中的运算符重载有两种形式:①重载为类的成员函数(见C++运算符重载(成员函数方式)),②重载为类的友元函数。
当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->。
重载为友元函数的运算符重载函数的定义格式如下:
[cpp] view plaincopy
一、程序实例
[cpp] view plaincopy
1 //运算符重载:友元函数方式 2 #include <iostream.h> 3 4 class complex //复数类 5 { 6 public: 7 complex(){ real = imag = 0;} 8 complex(double r, double i) 9 { 10 real = r; 11 imag = i; 12 } 13 friend complex operator + (const complex &c1, const complex &c2); //相比于成员函数方式,友元函数前面加friend,形参多一个,去掉类域 14 friend complex operator - (const complex &c1, const complex &c2); //成员函数方式有隐含参数,友元函数方式无隐含参数 15 friend complex operator * (const complex &c1, const complex &c2); 16 friend complex operator / (const complex &c1, const complex &c2); 17 18 friend void print(const complex &c); //友元函数 19 20 private: 21 double real; //实部 22 double imag; //虚部 23 24 }; 25 26 complex operator + (const complex &c1, const complex &c2) 27 { 28 return complex(c1.real + c2.real, c1.imag + c2.imag); 29 } 30 31 complex operator - (const complex &c1, const complex &c2) 32 { 33 return complex(c1.real - c2.real, c1.imag - c2.imag); 34 } 35 36 complex operator * (const complex &c1, const complex &c2) 37 { 38 return complex(c1.real * c2.real - c1.imag * c2.imag, c1.real * c2.real + c1.imag * c2.imag); 39 } 40 41 complex operator / (const complex &c1, const complex &c2) 42 { 43 return complex( (c1.real * c2.real + c1.imag * c2. imag) / (c2.real * c2.real + c2.imag * c2.imag), 44 (c1.imag * c2.real - c1.real * c2.imag) / (c2.real * c2.real + c2.imag * c2.imag) ); 45 } 46 47 void print(const complex &c) 48 { 49 if(c.imag < 0) 50 cout<<c.real<<c.imag<<‘i‘<<endl; 51 else 52 cout<<c.real<<‘+‘<<c.imag<<‘i‘<<endl; 53 } 54 55 int main() 56 { 57 complex c1(2.0, 3.5), c2(6.7, 9.8), c3; 58 c3 = c1 + c2; 59 cout<<"c1 + c2 = "; 60 print(c3); //友元函数不是成员函数,只能采用普通函数调用方式,不能通过类的对象调用 61 62 c3 = c1 - c2; 63 cout<<"c1 - c2 = "; 64 print(c3); 65 66 c3 = c1 * c2; 67 cout<<"c1 * c2 = "; 68 print(c3); 69 70 c3 = c1 / c2; 71 cout<<"c1 / c2 = "; 72 print(c3); 73 return 0; 74 }
二、程序运行结果
从运行结果上我们就可以看出来,无论是通过成员函数方式还是采用友元函数方式,其实现的功能都是一样的,都是重载运算符,扩充其功能,使之能够应用于用户定义类型的计算中。
三、两种重载方式(成员函数方式与友元函数方式)的比较
一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。因为,它如果被重载为友元函数,将会出现与赋值语义不一致的地方。
时间: 2024-12-28 11:48:53