C++中的友元概念是為了將類的私有不可見部分暴露給有權(quán)限訪問的人(包括類,類中的成員函數(shù),全局函數(shù))
采用類的機制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分(注意友元函數(shù)不是類的一部分),但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該函數(shù)的友元函數(shù)。除了友元函數(shù)外,還有友元類,兩者統(tǒng)稱為友元。友元的作用是提高了程序的運行效率(即減少了類型檢查和安全性檢查等都需要時間開銷),但它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員。
對于類作為(某類的)友元對象的情況:
這個友元類是否要定義在某類前不做限制,只要這個友元類是在某類的作用域范圍內(nèi)可見即可。
class Window_Mgr
{
public:
??? Window_Mgr& relocate()
??? {
??? }
};
class Sreen
{
??? friend class Window_Mgr;//將Window_Mgr類作為友元對象,這樣Window_Mgr類可以使用Screen類的私有部分
private:
??? int width;//可以被Window_Mgr類使用,因為Window_Mgr類是Screen類的友元;下面height同理
??? int height;
};
對于類成員函數(shù)作為(某類的)友元函數(shù)的情況:必須先定義準(zhǔn)備作為友元的類及相應(yīng)的成員函數(shù),這樣才能被某類作為友元函數(shù),格式如下:
class Window_Mgr
{
public:
????Window_Mgr& relocate(Screen::index r, Screen::index c, Screen& s);//這個函數(shù)需要在Screen類定義前先定義,這樣被Screen類設(shè)為友元函數(shù)
...
};
class Screen
{
??? friend Window_Mgr& Window_Mgr::relocate(Window_Mgr::index, Window_Mgr::index, Screen&);//函數(shù)名必須用改函數(shù)所屬的類名加以限定,這樣才能正確定位到特定函數(shù)
...
};
全局函數(shù)作為(某類的)友元函數(shù)的情況:
這個全局函數(shù)是否要定義在某類前不做限制,只要這個全局函數(shù)是在某類的作用域范圍內(nèi)可見即可。
這個全局函數(shù)可以在某類內(nèi)部定義,這個全局函數(shù)的作用域擴(kuò)展到包圍某類定義的作用域
class X
{
friend void f()
{
??????? /*function body*/
}
...
};
class Y
{
?void g()
{
return ::f();
}
};
在重載函數(shù)的情況中:
某類必須將每一個希望成為(某類的)友元函數(shù)分別聲明,不會出現(xiàn)聲明了某一個函數(shù)為(某類的)友元函數(shù),其他重載函數(shù)都成為(某類的)友元函數(shù)的情況。即友元函數(shù)的聲明具有針對性。
??
??