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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM