C Primer 學習筆記 友元

2021-06-19 01:03:46 字數 2074 閱讀 4333

友元機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類。友元的宣告以關鍵字friend開始,只能出現在類定義的內部,友元的宣告可以出現在類內部的任何地方。通常,將友元成組地放在類的開始或者結尾是個好主意。

1.友元關係:乙個例子

class   screen;

//window_mgr的成員可以直接引用screen的私有成員

window_mgr& window_mgr::relocate(screen::index r, screen::index c, screen &s )

友元可以是普通的非成員函式,或者前面定義的其他類的成員函式,或者整個類。將乙個類設為友元,則友元類的的所有成員函式都可以訪問授予友元關係的那個類的非公有成員。

2.使其他類的成員函式成為友元

錯誤示例1:

class window_mgr;

class screen

class window_mgr

}

註解:編譯到screen時,由於screen類使用到window_mgr的成員函式,雖然前面給出了window_mgr的宣告,但此時還清楚window_mgr的完整定義,所以編譯出錯。

錯誤示例2:

class screen;

class window_mgr

}class screen

註解:編譯到relocate時,由於screen& s的實現使用到screen的成員變數,雖然前面給出了screen的宣告,但此時還清楚screen的完整定義,所以編譯出錯。

正確示例3:

class screen;

class window_mgr

class screen

window_mgr& window_mgr::relocate(window_mgr::index r, window_mgr::index c, screen& s)

註解:將window_mgr::relocate的實現移動到最後,由於編譯類window_mgr時,並不需要screen&s 的實現細節,問題得到解決。

結論:window_mgr必須先定義,否則,screen類就不能將window_mgr中的成員函式指定為友元,並且,只有在定義類screen後,才能定義relocate函式——將其設為友元就是為了訪問screen的成員,否則,當其訪問screen類中成員時,將會編譯出錯,如例項2。

若將某個類中的成員函式設為另外乙個類的友元,則有嚴格的順序:必須先定義包含成員函式的類,再將成員函式設為另外乙個類的友元,最後是該成員函式的實現。

3.過載函式與友元關係

類必須將過載函式集中每乙個希望設為友元的函式都宣告為友元

//函式過載 

extern std::ostream& storeon(std::ostream&, screen&)

extern bitmap& storeon(bitmap&, screen&)

class screen

類screen將接受乙個ostream&的storeon版本設為自己的友元,接受乙個bitmap&的版本對screen沒有特殊訪問權。

4.總結

① 友元可以訪問類的私有成員,友元只能出現在類定義內部,友元宣告可以在類中的任何地方,通常,將友元成組地放在類的開始或者結尾。

② 友元可以是普通的非成員函式,或前面定義的其他類的成員函式,或整個類。

③ 類必須將過載函式集中每乙個希望設為友元的函式都宣告為友元。

④ 友元關係是單向的。若類b是類a的友元,類a不一定是類b的友元。

⑤ 友元關係不具有傳遞性。若類b是類a的友元,類c是b的友元,類c不一定是類a的友元。

⑥ 友元關係不能繼承,基類的友元對派生類的成員沒有特殊的訪問許可權。如果基類被授予友元關係,則只有基類具有特殊的訪問許可權。該基類的派生類不能訪問授予友元關係的類。

C Primer友元類使用

照著c primer一書上的智慧型指標實現了下。結果發現編譯一直通不過。後來發現原來被宣告為友元類的類要放在宣告友元類的後面在vs2012上才能通過。ifndef smart point h define smart point h class u ptr u ptr class hasptr ha...

C 友元學習筆記

友元可以分為三種 1.友元函式 2.友元類 3.友元成員函式 友元的好處,通過友元函式,可以賦予函式與類成員函式相同的訪問許可權,友元函式是可以訪問類私有成員的非類成員函式。因為友元函式不是類的成員函式,所以不能用類物件呼叫成員函式的方式 類成員符 調用友元函式。友元函式的建立 templatecl...

友元 c 學習筆記

size medium 1.含義 友元關係以 color blue friend color 關鍵字宣告,包括友元函式和友元類。2.作用 訪問與其有好友關係的類中的私有成員。3.友元函式可以是一般函式 非成員函式 也可以是另乙個類中的成員函式。4.友元 利弊 1 利 有助於資料共享,可以提公升程式的...