1 1 class A
2 2 {
3 3 int m_a;
4 4 public:
5 19 friend class B;//A为B的友元类
6 5 A::A(int a) :m_a(a) {}
7 6 void SetaValue(int a)
8 7 {
9 8 m_a = a;
10 9 }
11 10 int GetbValue(void)
12 11 {
13 12 return m_a;
14 13 }
15 14 };
16 15 class B
17 16 {
18 17 int m_b;
19 18 public:
20 20 int GetClassAValue(A& a)
21 21 {
22 22 return a.GetbValue();
23 23 }
24 24 };
25 25 class C
26 26 {
27 27 int m_c;
28 28 public:
29 30 int GetClassAValue(A& a)
30 31 {
31 32 return a.GetbValue();
32 33 }
33 34 };
34 35
35 36
36 37
37 38 int main(int argc, char **argv)
38 39 {
39 40 A a(10);
40 41 B b;
41 42 C c;
42 43 int retb = b.GetClassAValue(a);//返回值为10
43 44 int retc = c.GetClassAValue(a);//返回值为10,可见class A里的公共借口GetbValue()破坏了封装,
44 45 }
上面的A中的借口GetbValue()显然破坏了类的封装性,所以不要在类中直接加访问私有成员的公有接口。可以改成如下形式:
1 class A
2 {
3 int m_a;
4 public:
5 friend class B; //A为B的友元类
6 A::A(int a) :m_a(a) {}
7 };
8 class B
9 {
10 int m_b;
11 public:
12 int GetClassAValue(const A& a)
13 {
14 return a.m_a;
15 }
16 };
17 class C
18 {
19 int m_c;
20 public:
21 };
22
23 int main(int argc, char **argv)
24 {
25 A a(10);
26 B b;
27 C c;
28 b.GetClassAValue(a);
29 }
30
31 在这里C是无法访问A的私有成员的,保证数据的封装。而B又可以通过友元访问A