分享

C++ 友元关系

 tianht 2016-05-31

在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

下面给一个简单的例程代码;

 

复制代码
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class B;
 6 
 7 class A{
 8     private:
 9         int x;
10     public:
11         A();
12         void display(B &);
13 };
14 
15 class C;
16 
17 class B{
18     private:
19         int y;
20         int z;
21     public:
22         B();
23         B(intint);
24     friend void A::display(B &);//友元成员函数
25     friend void display(B &);//友元函数
26     friend class C;//友元类
27 };
28 
29 class C{
30     private:
31         int sum;
32         void calc(B &);
33     public:
34         C();
35         void display(B &);
36 };
37 
38 //必须在友元关系的类后进行定义
39 void display(B &v)//友元函数
40 {
41     cout << v.y << " " << v.z << endl;
42 }
43 
44 A::A()
45 {
46     this->= 0;
47 }
48 
49 void A::display(B &v)//友元成员函数
50 {
51     this->= v.y + v.z;
52     cout << this-><< endl;
53 }
54 
55 B::B()
56 {
57     this->= 0;
58     this->= 0;
59 }
60 
61 B::B(int y, int z)
62 {
63     this->= y;
64     this->= z;
65 }
66 
67 C::C()
68 {
69     sum = 0;
70 }
71 
72 void C::display(B &v)
73 {
74     this->calc(v);
75     cout << sum << " = " << v.y << " + " << v.z << endl;
76 }
77 
78 void C::calc(B &v)
79 {
80     sum = v.y + v.z;
81 }
82 
83 int main()
84 {
85     A a;
86     B b(23);
87     display(b);
88     a.display(b);
89     C c;
90     c.display(b);
91     
92     return 0;
93 }
94 
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多