C++從0到1基礎(chǔ)教程之友元,3段代碼助你零基礎(chǔ)修行C++友元

前言
上一章節(jié)主要是詳細(xì)介紹了const成員和static成員。不清楚的可以回顧一下哦。本章節(jié)主要針對于C++中的友元做一個詳細(xì)介紹。
友元
友元(frend)機(jī)制允許一個類將對其非公有成員的訪問權(quán)授予指定的函數(shù)或者類,友元的聲明以friend開始,它只能出現(xiàn)在類定義的內(nèi)部,友元聲明可以出現(xiàn)在類中的任何地方。友元可以是一個函數(shù),該函數(shù)被稱為友元函數(shù);友元也可以是一個類,該類被稱為友元類,在這種情況下,整個類及其所有成員都是友元。


友元函數(shù)
友元函數(shù)的使用,因?yàn)橛言瘮?shù)沒有this指針,則參數(shù)要有三種情況:?
要訪問非static成員時,需要對象做參數(shù)。
訪問static成員或全局變量時,則不需要對象做參數(shù)。
全局對象則不需要對象做參數(shù)。
可以直接調(diào)用友元函數(shù),不需要通過對象或指針。
在友元函數(shù)中對象或者指針才具有無視權(quán)限限定的特權(quán)
測試學(xué)習(xí)代碼如下:

成員函數(shù)是友元函數(shù)
使類B中的成員函數(shù)成為類A的友元函數(shù),這樣類B的該成員函數(shù)就可以訪問類A的所有成員了。
當(dāng)用到友元成員函數(shù)時,需注意友元聲明和友元定義之間的相互依賴,在該例子中,類B必須先定義,否則類A就不能將一個B的函數(shù)指定為友元。然而,只有在定義了類A之后,才能定義類B的該成員函數(shù)。更一般的講,必須先定義包含成員函數(shù)的類,才能將成員函數(shù)設(shè)為友元。另一方面,不必預(yù)先聲明類和非成員函數(shù)來將它們設(shè)為友元。
如下測試代碼:

友元類
友元類的所有成員函數(shù)都是另一個類的友元函數(shù),都可以訪問另一個類中的隱藏信息(包括私有成員和保護(hù)成員)。當(dāng)希望一個類可以存取另一個類的私有成員時,可以將該類聲明為另一類的友元類。
關(guān)于友元類的注意事項(xiàng):
友元關(guān)系不能被繼承。
友元關(guān)系是單向的。
友元關(guān)系不具有傳遞性。
如一下測試代碼:

尾言
允許某些特定的非成員函數(shù)訪問一個類的私有成員(及受保護(hù)成員),而同時仍阻止一般的訪問的情況下,友元是可用的。
優(yōu)點(diǎn):
1.靈活實(shí)現(xiàn)訪問若干類私有或受保護(hù)成員才能完成的任務(wù);
2.便于與不支持類的語言(如C語言、匯編等)進(jìn)行混合編程;
3.更自然地使用C++語言的IO流庫。
缺點(diǎn):一個類將對其非公有成員的訪問權(quán)限授予其他函數(shù)或者類,會破壞該類的封裝性,降低該類的可靠性和可維護(hù)性。
