先附上基本和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開始,它只能出現在類定義的內部,友...