C++ 友元类使用 (friend)
C++中私有变量对外部类是不能直接访问的,也是不能继承的。
使用友元类可以访问类中的私有方法、私有变量,虽然对类的封装有一定的破坏,但是有时也是很实用的。
在实际中,在修改已有代码时,为了不大改动已有代码:
(1) 对于没有继承关系的类,如果有关联,使用友元类还是比较方便的。
(2) 对于有继承关系的类,如果有关联,可以将变量访问由private改为protected。
直接看代码例子:
a.h
1 #include<stdio.h> 2 //注意: 该类文件中, 不要包含b.h, 否则会报错 3 4 //注意: 由于不是同一个命名空间, 这里申明一下class B2 5 namespace st1{ 6 namespace st2{ 7 class B2; 8 } 9 } 10 11 class A{ 12 public: 13 void print(){ 14 printf("A print function\n"); 15 } 16 17 private: 18 void _inner_print(){ 19 printf("A print _inner_print\n"); 20 } 21 22 //注意: 申明友元类, 方便两个类中可以直接访问private变量, 函数 23 friend class B1; 24 friend class ::st1::st2::B2; 25 26 };
b.h
1 #include "a.h" 2 3 //定义B1 4 class B1{ 5 public: 6 void print(){ 7 printf("\ncall B1 print\n"); 8 a.print(); 9 a._inner_print(); 10 } 11 12 private: 13 A a; 14 }; 15 16 //定义B2 17 namespace st1{ 18 namespace st2{ 19 20 class B2{ 21 public: 22 void print(){ 23 printf("\ncall B2 print\n"); 24 a.print(); 25 a._inner_print(); 26 } 27 28 private: 29 A a; 30 }; 31 32 } 33 }
测试文件main.cpp
1 #include <stdio.h> 2 #include "b.h" 3 4 int main(){ 5 B1 b1; 6 ::st1::st2::B2 b2; 7 8 b1.print(); 9 b2.print(); 10 return 0; 11 }
输出:
call B1 print
A print function
A print _inner_print
call B2 print
A print function
A print _inner_print