码迷,mamicode.com
首页 > 编程语言 > 详细

C++运算符重载(友元函数方式)

时间:2015-07-10 22:05:29      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

我们知道,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 }

 

二、程序运行结果 

技术分享
从运行结果上我们就可以看出来,无论是通过成员函数方式还是采用友元函数方式,其实现的功能都是一样的,都是重载运算符,扩充其功能,使之能够应用于用户定义类型的计算中。

三、两种重载方式(成员函数方式与友元函数方式)的比较

一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。因为,它如果被重载为友元函数,将会出现与赋值语义不一致的地方。

C++运算符重载(友元函数方式)

标签:

原文地址:http://www.cnblogs.com/GarfieldEr007/p/4637551.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!