在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;
C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。
友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;
友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;
友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;
值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;
下面给一个简单的例程代码;
1#include<iostream>
2
3usingnamespacestd;
4
5classB;
6
7classA{
8private:
9intx;
10public:
11A();
12voiddisplay(B&);
13};
14
15classC;
16
17classB{
18private:
19inty;
20intz;
21public:
22B();
23B(int,int);
24friendvoidA::display(B&);//友元成员函数
25friendvoiddisplay(B&);//友元函数
26friendclassC;//友元类
27};
28
29classC{
30private:
31intsum;
32voidcalc(B&);
33public:
34C();
35voiddisplay(B&);
36};
37
38//必须在友元关系的类后进行定义
39voiddisplay(B&v)//友元函数
40{
41cout<<v.y<<""<<v.z<<endl;
42}
43
44A::A()
45{
46this->x=0;
47}
48
49voidA::display(B&v)//友元成员函数
50{
51this->x=v.y+v.z;
52cout<<this->x<<endl;
53}
54
55B::B()
56{
57this->y=0;
58this->z=0;
59}
60
61B::B(inty,intz)
62{
63this->y=y;
64this->z=z;
65}
66
67C::C()
68{
69sum=0;
70}
71
72voidC::display(B&v)
73{
74this->calc(v);
75cout<<sum<<"="<<v.y<<"+"<<v.z<<endl;
76}
77
78voidC::calc(B&v)
79{
80sum=v.y+v.z;
81}
82
83intmain()
84{
85A a;
86B b(2,3);
87display(b);
88a.display(b);
89C c;
90c.display(b);
91
92return0;
93}
94
原文链接: https://www.cnblogs.com/accepted/archive/2010/09/04/1818173.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14660
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!