C++的友元类和友元函数实例

 1 #include <math.h>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 class Point
 6 {
 7 public:
 8     Point(double xx, double yy)
 9     {
10         x=xx;
11         y=yy;
12     }
13     void Getxy();
14     friend double Distance(Point &a, Point &b);        //类Point的友元函数
15     friend class You;                //类Point的友元类
16 private:
17     double x, y;
18 };
19 
20 
21 class You
22 {
23 public:
24     double Multi(Point &a)
25     {
26         return a.x * a.y + 1;
27     }
28 };

32 void Point::Getxy()
33 {
34     cout<<"("<<x<<","<<y<<")"<<endl;
35 }
36 double Distance(Point &a, Point &b)            //类Point的友元函数
37 {
38     double dx = a.x - b.x;
39     double dy = a.y - b.y;
40     return sqrt(dx*dx+dy*dy);
41 }
42 int main(void)
43 {
44     Point p1(3.0, 4.0), p2(6.0, 8.0);
45     p1.Getxy();
46     p2.Getxy();
47     double d = Distance(p1, p2);            //Distance是类Point的友元函数,不是成员函数
48     cout<<"Distance is "<<d<<endl;
49     You you;
50     d = you.Multi(p1);
51     cout<<"Math.Multi is "<<d<<endl;
52     return true;
53 }

 

为什么会有友元函数?

 

结合着类的特性和类中一般成员函数,我们可以这样理解:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有 成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该 看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。

 

为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但 它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的 作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样.

posted @ 2016-07-29 09:39  winfu  阅读(4437)  评论(0编辑  收藏  举报