乙個類中可以有 public、protected、private 三種屬性的成員,通過物件可以訪問 public 成員,只有本類中的函式可以訪問本類的 private 成員。現在,我們來介紹一種例外情況——友元(friend)。借助友元(friend),可以使得其他類中的成員函式以及全域性範圍內的函式訪問當前類的 private 成員。
友元函式兩點:
這樣就構成了友元函式。友元函式可以是不屬於任何類的非成員函式,也可以是其他類的成員函式。
示例一:
#include
#include
class student
;void
setage
(int age)
;void
setscore
(int score)
;char
*getname()
;int
getage()
;int
getscore()
;//友元函式,不屬於student
friend void
show
(student *stu);}
;student:
:student()
採用引數初始化表
student:
:student
(char
*name,
int age,
int score)
:m_name
(name)
,m_age
(age)
,m_score
(score)
void
show
(student * stu)
intmain
(int argc,
char
const
*ar**)
/*執行結果:
student (): called
姓名: 李華 年齡: 20 分數:99
student(char *name, int age, int score):called
姓名: 李芳 年齡: 20 分數:99
*/
show() 是乙個全域性範圍內的非成員函式,它不屬於任何類,它的作用是輸出學生的資訊。m_name、m_age、m_score 是 student 類的 private 成員,原則上不能通過物件訪問,但在 show() 函式中又必須使用這些 private 成員,所以將 show() 宣告為 student 類的友元函式。
注意,友元函式不同於類的成員函式,在友元函式中不能直接訪問類的成員,必須要借助物件。
下面是錯誤的:
void
show()
成員函式在呼叫時會隱式地增加 this 指標,指向呼叫它的物件,從而使用該物件的成員;而 show() 是非成員函式,沒有 this 指標,編譯器不知道使用哪個物件的成員,要想明確這一點,就必須通過引數傳遞物件(可以直接傳遞物件,也可以傳遞物件指標或物件引用),並在訪問成員時指明物件。
示例2:
#include
#include
class address;
class student
;void
setage
(int age)
;void
setscore
(int score)
;char
*getname()
;int
getage()
;int
getscore()
;//student類的成員函式
void
show()
;void
show
(address *addr);}
;class address
;address:
:address
(char
*province,
char
*city,
char
*district)
採用引數初始化表
student:
:student
(char
*name,
int age,
int score)
:m_name
(name)
,m_age
(age)
,m_score
(score)
void student:
:show()
void student:
:show
(address *addr)
intmain
(int argc,
char
const
*ar**)
/*執行結果:
student(char *name, int age, int score):called
姓名: 李芳 年齡: 20 分數:99
省份: 河南省 城市: 鄭州市 距離:50km
*/
本例定義了兩個類 student 和 address,程式第將 student 類的成員函式 show() 宣告為 address 類的友元函式,由此,show() 就可以訪問 address 類的 private 成員變數了。
如果將類 b 宣告為類 a 的友元類,那麼類 b 中的所有成員函式都是類 a 的友元函式,可以訪問類 a 的所有成員,包括 public、protected、private 屬性的。
示例3:
#include
#include
class address;
class student
;void
setage
(int age)
;void
setscore
(int score)
;char
*getname()
;int
getage()
;int
getscore()
;//student類的成員函式都是address的右元函式
void
show
(address *addr);}
;class address
;//address建構函式
address:
:address
(char
*province,
char
*city,
char
*district)
採用引數初始化表建構函式
student:
:student
(char
*name,
int age,
int score)
:m_name
(name)
,m_age
(age)
,m_score
(score)
void student:
:show
(address *addr)
intmain
(int argc,
char
const
*ar**)
/*執行結果:
student(char *name, int age, int score):called
姓名: 李芳 年齡: 20 分數:99
省份: 河南省 城市: 鄭州市 距離:50km
*/
有的編譯器也可以不寫 class 關鍵字,不過為了增強相容性還是建議寫上。
關於友元,有兩點需要說明:
除非有必要,一般不建議把整個類宣告為友元類,而只將某些成員函式宣告為友元函式,這樣更安全一些。
C 友元函式和友元類(C friend)詳解
私有成員只能在類的成員函式內部訪問,如果想在別處訪問物件的私有成員,只能通過類提供的介面 成員函式 間接地進行。這固然能夠帶來資料隱藏的好處,利於將來程式的擴充,但也會增加程式書寫的麻煩。c 是從結構化的c語言發展而來的,需要照顧結構化設計程式設計師的習慣,所以在對私有成員可訪問範圍的問題上不可限制...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...