友元提供了不同類的成員函式之間、類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。c++中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。
友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝性和資料的隱藏性,導致程式可維護性變差。
友元函式:
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名(形式引數);
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。 友元函式的呼叫與一般函式的呼叫方式和原理一致。
友元類 :
友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。
當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。定義友元類的語句格式如下:
//其中:friend和class是關鍵字,類名必須是程式中的乙個已定義過的類
friend class 類名;
#include
using
namespace
std;
class radius
~radius()
private:
int r;
};void show_r(radius &n)
class circle
~circle(){}
double area(radius a)
private:
double s;
};int main(int argc, char *argv)
同時為兩個類的友元(函式、類),引數中的類都需要提前宣告
class window; // 只宣告
class screen
; class window
;
作為乙個類的函式又是另乙個類的友元
如果我們決定該函式必須作為乙個類的成員函式並又是另乙個類的友元,則成員函式宣告和友元宣告如下:
//因為在screen類中的copy函式使用了window類,因此需要提前有宣告
class window;
class screen
; class window
;
只有當乙個類的定義已經被看到時它的成員函式才能被宣告為另乙個類的友元。這並不總是能夠做到的。例如如果screen 類必須把window 類的成員函式宣告為友元,而window類必須把screen 類的成員函式宣告為友元。該怎麼辦呢?在這種情況下可以把整個window類宣告為screen 類的友元。當乙個類是另乙個類的友元類時,其類內部的成員函式也自然是另乙個類的友元函式。例如:
class window;
class screen
;
注意點:
巢狀類、友元類與繼承類的區別
巢狀類
class
t1;};
友元類
class
t1 ;
class
t2 ;
巢狀友元類:
class
t1 ;
};//此處注意:友元宣告要放在巢狀類宣告後面
應用
一般一元函式最好過載為成員函式,二元函式一般過載為友元函式,賦值操作符只能過載為成員函式,++與–操作符有兩種形式,一般被過載為成員函式,其中字尾過載帶有啞元,可以參見
友元函式與友元類
物件導向程式設計的乙個重要思想就是實現資料隱藏 類的封裝特性 即 非成員函式不能訪問private 或者 protected 變數。有些時候我們需要不經成員函式而訪問private 或者 protected資料,那就需要用到 友元函式 或者友元類。使用friend關鍵字在類內任意位置宣告函式為友元函...
友元函式與友元類
友元函式 需要友元的原因 1 普通函式需要直接訪問乙個類的保護或私有資料成員 2 需要友元的另乙個原因是為了方便過載操作符的使用 友元函式不是成員函式,它是類的朋友,因而能夠訪問類的全部成員 在類的內部,只能宣告它的函式原型,加上friend 關鍵字 優缺點 優點 能夠提高效率,表達簡單,清晰 缺點...
c 友元函式與友元類
友元函式和友元類的需要 類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢...