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