在 c++ 中,乙個類中可以有 public、protected、private 三種屬性的成員,通過物件可以訪問 public 成員,只有本類中的函式可以訪問本類的 private 成員。現在,我們來介紹一種例外情況——友元(friend)。借助友元(friend),可以使得其他類中的成員函式以及全域性範圍內的函式訪問當前類的 private 成員。
在當前類以外定義的、不屬於當前類的函式也可以在類中宣告,但要在前面加 friend 關鍵字,這樣就構成了友元函式。友元函式可以是不屬於任何類的非成員函式,也可以是其他類的成員函式,友元函式可以訪問當前類中的所有成員,包括 public、protected、private 屬性的。
。
1) 將非成員函式宣告為友元函式
#include
using namespace 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
show() 是乙個全域性範圍內的非成員函式,它不屬於任何類,它的作用是輸出學生的資訊。m_name、m_age、m_score 是 student 類的 private 成員,原則上不能通過物件訪問,但在 show() 函式中又必須使用這些 private 成員,所以將 show() 宣告為 student 類的友元函式。讀者可以親自測試一下,將上面程式中的第 8 行刪去,觀察編譯器的報錯資訊。
注意,***友元函式不同於類的成員函式,在友元函式中不能直接訪問類的成員,必須要借助物件。***下面的寫法是錯誤的:
void
show()
成員函式在呼叫時會隱式地增加 this 指標,指向呼叫它的物件,從而使用該物件的成員;而 show() 是非成員函式,沒有 this 指標,編譯器不知道使用哪個物件的成員,要想明確這一點,就必須通過***引數傳遞***物件(可以直接傳遞物件,也可以傳遞物件指標或物件引用,所以上例中的show(student *pstu)要使用類物件進行引數傳遞),並在訪問成員時指明物件。
#include
using namespace 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
家庭住址:河北省衡水市桃城區
不僅可以將乙個函式宣告為乙個類的「朋友」,還可以將整個類宣告為另乙個類的「朋友」,這就是友元類。友元類中的所有成員函式都是另外乙個類的友元函式。
例如將類 b 宣告為類 a 的友元類,那麼類 b 中的所有成員函式都是類 a 的友元函式,可以訪問類 a 的所有成員,包括 public、protected、private 屬性的。
更改上例的**,將 student 類宣告為 address 類的友元類:
#include
using namespace 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()
第 24 行**將 student 類宣告為 address 類的友元類,宣告語句為:
friend class student;
關於友元,有兩點需要說明:
1.友元的關係是單向的而不是雙向的。如果宣告了類 b 是類 a 的友元類,不等於類 a 是類 b 的友元類,類 a 中的成員函式不能訪問類 b 中的 private 成員。
2.友元的關係不能傳遞。如果類 b 是類 a 的友元類,類 c 是類 b 的友元類,不等於類 c 是類 a 的友元類。
除非有必要,一般不建議把整個類宣告為友元類,而只將某些成員函式宣告為友元函式,這樣更安全一些。
友元(友元函式 友元類 類成員函式的友元)
friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...
友元函式 友元類 友元成員
友元 友元函式 友元類和友元成員函式 c 有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以fr...
友元函式 友元類
friend class 1 友元函式 2 友元類 友元函式與友元類。c 中以關鍵字friend宣告友元關係。友元可以訪問與其有friend關係的 類中的私有成員。友元包括友元函式和友元類。1 友元函式 如果在本類以外的其它地方定義了乙個函式 這個函式可以是不屬於任何類的非成員函式,也可以是其它類的...