C 友元的認識

2021-06-06 02:39:11 字數 2534 閱讀 8512

先附上基本和c++程式設計思想裡第五章p134 ~ p135  差不多的**供修改及以後 逐步理清概念

#include

using namespace std;

class x; // 預先宣告 不完全定義

class y;

class y;

class x

//四加乙個friend東西。。

friend void g(x*,int); //1.問:可以在外面修改x類中 i 的值麼

friend void y::f(x*); //2.問:友元的物件指定為某個類裡的乙個成員函式

friend class z; //3.某個類作為x的友元類,對i是否是可以直接訪問呼叫甚至修改i值?

friend void h(); //4.外部函式是否可以直接訪問x的私有成員?

friend int main(); //additional 會不會就無視x的所有私有成員?

};//普通x類裡的成員函式的實現

void x::initialize()

void g(x* x,int i)

void y::f(x* x)

class z

void g(x* x)

};void h(){

x x;

x.i = 1000;

cout<

friend void g(x*,int);     //1.問:可以在外面修改x類中 i 的值麼?

測試**:

測試結果:

結論: 友元函式如果是主程式中某個函式,一旦宣告友元將能夠直接修改引數類中的private值 諸如這一情況 直接修改了x->i;

反例:假設未宣告友元,情況又會怎麼樣呢?

這裡在主函式裡宣告乙個g2函式但是沒有在class x裡 加g2為友元函式

結果編譯不同過,編譯器鎖定了class x中的 i變數為private不可訪問!

friend void y::f(x*);   //2.問: 友元的物件指定為某個類裡的乙個成員函式,是否有修改x中 private變數i 的權力?

測試**:

測試結果:

小結: 某個類的友元函式可以加入另乙個類的成員函式。

這個反例不再舉了,因為他的機制和問題一中的大致相同,再沒有加為x友元函式之前 y::f() 也是剝奪了訪問x類的private變數權力

friend struct z; //3.某個類作為x的友元類,對i是否是可以直接訪問呼叫甚至修改 i 值?

測試**:

測試結果:

小結: 這個例子中是z類作為 x類的乙個友元類, 直接可以在函式中修改x所有的private變數

friend void h(); //4.外部函式是否可以直接訪問x的私有成員?

測試**:

測試結果:

小結: 外部函式如果申明為由原函式也可以直接訪問到該類的私有成員。

總結以上四個問題的解決可以說涵蓋了c++友元常用到的情況之後,其實友元friend這個符號,說白了就是開了一條直達某個類私有成員的通道。雖然呼叫起來更方便了,但是也破壞了封裝,希望能總結出乙個最合理的使用友元的度。

把main函式設為該類的友元類:

測試**:

測試結果:

小結:非常犀利,把主函式 int main()加到 x 的友元函式之後,  main 函式完全解除 x類神秘的面紗,私有成員隨便用。。 很強大!

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...

C 友元 友元函式 友元類和友元成員函式

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...