1. 程式人生 > >C++中友元的理解

C++中友元的理解

1.友元成員函式

先上程式碼

#include <iostream>  
  
class B;//由於類B的定義在類A之後,所以用到類B的宣告時,使用前向宣告  
  
class A{  
private:  
    void func()  
    {  
        std::cout << "A::func()" << std::endl;  
    }  
public:  
    void call_func_of_B(B &b);//可以使用類B定義指標,引用,物件,因為上文有前向宣告  
};  
  
class B{  
private:  
    void func()  
    {  
        std::cout << "B::func()" << std::endl;  
    }  
    friend void A::call_func_of_B(B &b);//友元宣告將類A的成員函式宣告為類B的友元函式  
};  
//定義類A成員函式  
void A::call_func_of_B(B &b)  
{  
    b.func();  
}  


//友元函式,將A類中的成員函式申明為B類中的友元函式,則此成員函式不僅擁有A類的所有變數的訪問許可權,而且擁有了B類的的有成員變數的訪問權。
同理,我們也可以將類B的成員函式宣告為類A的友元函式,則此成員函式同樣擁有了兩個類所有成員變數的訪問權。


2.友元類


友元除了前面講過的函式以外,友元還可以是類,即一個類可以作另一個類的友元。當一個類作為另一個類的友元時,這就意味著這個類的所有成員函式都是另一個類的友元函式。


使用友元類時注意:


(1) 友元關係不能被繼承。


(2) 友元關係是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的宣告。


(3) 友元關係不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明


總結起來:


(1)友元關係不可以繼承,但對已有的方法來說訪問許可權不改變。


(2)如果改寫基類的方法則訪問許可權改變


(3)友元關係不具有傳遞性


若類B是類A的友元,類C是B的友元,類C不一定是類A的友元。


#include <iostream>  
  
using namespace std;  
  
class CObj  
{  
public:  
    CObj() : mX(0), mY(0) {}  
    friend class CFriend;  //類CFriend 申明為CObj的友元,
private:  
    void PrintData() const  
    {  
        cout << "mX = " << mX << endl  
             << "mY = " << mY << endl;  
    }  
    int mX;  
    int mY;  
};  
  
class CFriend  
{  
public:  
    CFriend(int x, int y)  
    {  
        mObj.mX = x;    //直接呼叫類CObj的私有資料成員  
        mObj.mY = y;  
    }  
    void ShowData() const  
    {  
        mObj.PrintData();   //直接呼叫類CObj的私有成員函式  
    }  
private:  
    CObj mObj;  
};  
  
int main()  
{  
    CFriend one(3, 4);  
    one.ShowData();  
    return 0;  
}  


執行結果:


mX = 3


mY = 4


//如上,在類CObj中,類CFriend 申明為CObj的友元,則在類CFriend中能直接訪問類CObj,中的所有成員,包括成員變,成員函式,私有的也可以。。