乙個類中可以有 public、protected、private 三種屬性的成員,通過物件可以訪問 public 成員,只有本類中的函式可以訪問本類的 private 成員。現在,我們來介紹一種例外情況——友元(friend)。借助友元(friend),可以使得其他類中的成員函式以及全域性範圍內的函式訪問當前類的 private 成員。
例:
#include usingnamespace
std;
class
student;
student::student(
char *name, int age, float
score): m_name(name), m_age(age), m_score(score)
// 全域性函式void show(student *pstu)
intmain()
執行結果:
小明的年齡是 15,成績是 90.6
李磊的年齡是 16,成績是 80.5
注意:
友元函式不同於類的成員函式,在友元函式中不能直接訪問類的成員,必須要借助物件。下面的寫法是錯誤的:
voidshow()
#include usingnamespace
std;
class address; //
提前宣告address類
//宣告student類
class
student;
//宣告address類
class
address;
//實現student類
student::student(char *name, int age, float
score): m_name(name), m_age(age), m_score(score)
void student::show(address *addr)
//實現address類
address::address(char *province, char *city, char *district)
intmain()
執行結果:
小明的年齡是 16,成績是 95.5
家庭住址:陝西省西安市雁塔區
李磊的年齡是 16,成績是 80.5
家庭住址:河北省衡水市桃城區
注意:
1.程式剛開始對address類進行提前宣告的意義在於:在address類定義之前,在student類中使用了它,如果不提前宣告,編譯器會報錯:'address' has not been declared'
2.程式將 student 類的宣告和實現分開了,而將 address 類的宣告放在了中間,這是因為編譯器從上到下編譯**,show() 函式體中用到了 address 的成員 province、city、district,如果提前不知道 address 的具體宣告內容,就不能確定 address 是否擁有該成員(類的宣告中指明了類有哪些成員)。
3.類的提前宣告的使用範圍是有限的,只有在正式宣告乙個類以後才能用它去建立物件。如果在上面程式的第4行之後增加如下所示的一條語句,編譯器就會報錯:
address addr; //企圖使用不完整的類來建立物件
4.乙個函式可以被多個類宣告為友元函式,這樣就可以訪問多個類中的 private 成員。
可以將整個類宣告為友元類,這樣友元類中的所有成員函式都是另乙個類的友元函式。
修改上述**:
#include usingnamespace
std;
class address; //
提前宣告address類
//宣告student類
class
student;
//宣告address類
class
address;
//實現student類
student::student(char *name, int age, float
score): m_name(name), m_age(age), m_score(score)
void student::show(address *addr)
//實現address類
address::address(char *province, char *city, char *district)
intmain()
將student類宣告為address類的友元類的語句為:
friend class student;
有的編譯器也可以不寫 class 關鍵字,不過為了增強相容性還是建議寫上。
注意:1.友元的關係是單向的而不是雙向的。如果宣告了類 b 是類 a 的友元類,不等於類 a 是類 b 的友元類,類 a 中的成員函式不能訪問類 b 中的 private 成員。
2.友元的關係不能傳遞。如果類 b 是類 a 的友元類,類 c 是類 b 的友元類,不等於類 c 是類 a 的友元類。
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...