通常對於普通函數來說,要訪問類的保護成員是不可能的,如果想這麼做那麼必須把類的成員都生命成為public(共用的),然而這做帶來的問題遍是任何外部函數都可以毫無約束的訪問它操作它,c++利用friend修飾符,可以讓一些你設定的函數能夠對這些保護數據進行操作,避免把類成員全部設置成public,最大限度的保護數據成員的安全。
友元能夠使得普通函數直接訪問類的保護數據,避免了類成員函數的頻繁調用,可以節約處理器開銷,提高程序的效率,但矛盾的是,即使是最大限度的保護,同樣也破壞了類的封裝特性,這即是友元的缺點,在現在cpu速度越來越快的今天我們並不推薦使用它,但它作為c++一個必要的知識點,一個完整的組成部分。
在類裡聲明一個普通函數,在前面加上friend修飾,那麼這個函數就成了該類的友元,可以訪問該類的一切成員。
#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { strcpy(Internet::name,name); strcpy(Internet::address,address); } friend void ShowN(Internet &obj);//友元函數的聲明 private: char name[20]; char address[20]; }; void ShowN(Internet &obj)//函數定義,不能寫成,void Internet::ShowN(Internet &obj) { cout<<obj.name<<endl; } void main() { Internet a("中國軟件開發實驗室","www.cndev-lab.com"); ShowN(a); cin.get(); } #include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) { strcpy(Internet::name,name); strcpy(Internet::address,address); } friend void ShowN(Internet &obj);//友元函數的聲明 private: char name[20]; char address[20]; }; void ShowN(Internet &obj)//函數定義,不能寫成,void Internet::ShowN(Internet &obj) { cout<<obj.name<<endl; } void main() { Internet a("中國軟件開發實驗室","www.cndev-lab.com"); ShowN(a); cin.get();
} 上面的代碼通過友元函數的定義,我們成功的訪問到了a對象的保護成員name,友元函數並不能看做是類的成員函數,它只是個被聲明為類友元的普通函數,所以在類外部函數的定義部分不能夠寫成void Internet::ShowN(Internet &obj),這一點要注意。