乙個類中可以有 public、protected、private 三種屬性的成員,通過物件可以訪問 public 成員,只有本類中的成員函式可以訪問本類的 private 成員。
在某些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍然阻止一般的訪問,這是通過友元函式來實現的。
友元機制允許乙個類將對其非公有成員的訪問許可權授予指定的函式或類。
友元的宣告以關鍵字friend開始。它只能出現在類定義的內部。友元宣告可以出現在類中的任何地方:友元不是授予友元關係的那個類的成員,所以它們不受其宣告出現部分訪問控制的影響,也就是友元函式/友元類可以在類的public、protected、private 訪問許可權下宣告。
優點:提高了程式的執行效率。
缺點:破壞了類的封裝性和資料的透明性。
盡量不使用友元函式,除非不得已的情況下才使用友元函式。
友元函式是可以直接訪問類的私有成員的非成員函式。它是定義在類外的普通函式,它不屬於任何類,但需要在類的定義中加以宣告,宣告時只需在友元的名稱前加上關鍵字friend,其格式如下:
friend 型別 函式名(形式引數);
友元函式的宣告可以放在類的私有部分,也可以放在公有部分,它們是沒有區別的,都說明是該類的乙個友元函式。
乙個函式可以是多個類的友元函式,只需要在各個類中分別宣告。
友元函式的呼叫與一般函式的呼叫方式和原理一致。
#include #include using namespace std;
class student
;student::student(string name, int age, float score)
//友元函式(隸屬於全域性)
void display(student &stu)
int main()
#include #include using namespace std;
class student;
class sumscore
;sumscore::sumscore()
class student
;student::student(string name, int age, float score)
void sumscore::addscore(const student &stu)
int main()
友元類的所有成員函式都是另乙個類的友元函式,都可以訪問另乙個類中的隱藏資訊(包括私有成員和保護成員)。
當希望乙個類可以訪問另乙個類的私有成員時,可以將該類宣告為另一類的友元類。宣告友元類的語句格式如下:
friend class 類名;
其中:friend和class是關鍵字,類名必須是程式中的乙個已定義過的類。例如:
#include using namespace std;
class a;
class b
;class a
;a::a()
void b::fun(a &a)
int main()
注意:(1) 友元關係不能被繼承。
(2) 友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定是類b的友元,要看在類中是否有相應的宣告。
(3) 友元關係不具有傳遞性。若類b是類a的友元,類c是b的友元,類c不一定是類a的友元,同樣要看類中是否有相應的申明。
(4)因為友元函式不是類的成員函式,所以沒有this指標。
C 友元函式 友元類 友元成員函式
眾所周知,c 控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以至於不適合特定的程式設計問題。在這種情況下,c 提供了另外一種形式的訪問許可權 友元,友元有3種 友元函式 友元類 友元成員函式。通過讓函式成為類的友元 即 友元函式 可以賦予該函式與類的成員函...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...