採用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。但是,有時需
要定義一些函式,
這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員
, 這時可以將這些函式定義為該 函式的友元函式。除了友元函式外,還有友元類,
兩者統稱為友元。友元的作用是提高了程式的執行效率(即減少了型別檢查和 安全性檢查等都需要時間開銷),但它破壞了類的封裝 性和隱藏性,使得非成員函式可以訪問類的私有成員。
友元可以是乙個函式,該函式被稱為
友元函式
;友元也可以是乙個類,該類被
稱為友元 類。
友元函式沒有this指標。this指標是在指向類成員本身,但是友元函式並不在類裡面,而是在類外面
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元
的名稱前加上 關鍵字
friend
,其格式如下:
friend
型別 函式名
(形式引數
);
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。
#if 1
#include#includeusing namespace std;
class point;
class pointmanager ;
class point
int get_x()
int get_y()
private:
int m_x;
int m_y;
};double pointdistance1(point &p1, point &p2)
double pointdistance2(point &p1, point &p2)
# if 0
//此種寫法錯誤
//改為友元函式類內申明 類外實現
class pointmanager
};#endif
//類中友元函式
double pointmanager::pointdistance3(point &p1, point &p2)
void test01()
void test02()
int main(void)
#endif
宣告位置:
友元宣告以關鍵字
friend
開始,它只能出現在類定義中。因為友元不是授權類的成員,所以它不受其所在類的宣告區域
public private
和 protected
的影 響。通常我們選擇把所有友元宣告組織在一起並放在類頭之後.
友元的利弊:
友元不是類成員,但是它可以訪問類中的私有成員。友元的作用在於提高程式的執行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函式可以訪問
類的私有成員。 不過,類的訪問許可權確實在某些應用場合顯得有些呆板,從而容
忍了友元這一特別語法 現象。
注意事項:
(1)
友元關係不能被繼承。
(2)
友元關係是單向的,不具有交換性。若類
b 是類
a 的友元,類
a 不一定是類b
的友元,要看在類中是否有相應的宣告。
(3)
友元關係不具有傳遞性。若類
b 是類
a 的友元,類
c 是
b 的友元,類
c 不一定 是類
a 的友元,同樣要看類中是否有相應的宣告。
c 之友元函式和友元類
友元函式提供了不同類的成員函式之間 類的成員函式與一般函式之間進行資料共享的機制。通過友元,乙個不同函式或另乙個類中的成員函式可以訪問類中的私有成員和保護成員。友元函式 友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外部的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需...
C 之友元函式和友元類
一 友元函式和友元類 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了 使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變數和保護...
C 之 友元類
友元類的全部成員函式都是還有乙個類的友元函式。都能夠訪問還有乙個類中的隱藏資訊 包含私有成員和保護成員 當希望乙個類能夠訪問還有乙個類的私有成員時,能夠將該類宣告為還有一類的友元類。定義友元類的語句格式例如以下 friend class 類名 當中 friend和class是關鍵字,類名必須是程式中...