2.友元函式的另一種實現
3.友元類
4.為什麼會有友元函式
class
person
;void
print
(person& a)
對於上面的person
類,內部有private
、protected
、public
的三類訪問許可權的成員。寫乙個外部函式print()
來列印這三類成員,則print()
可以訪問public
的,但是protected
和private
的無法訪問。
如果我們要讓print()
也可以訪問protected
和private
的成員,方法之一就是將print()
挪到print()
類內部使其成為成員函式,但是這樣print()
就不是外部函式了,這個時候這個方法就不合適了。而友元函式可以解決上面說的問題。
對於上面的需求:在外部函式訪問內部私有或者保護成員,可以通過將外部函式print()
宣告為print()
類的友元函式來解決。語法上的要求是將該函式在類內宣告,宣告需要加上friend
關鍵字修飾,
舉個栗子:
class
person
;person
(string name,
int age,
int height)
private
:int age;
protected
:int height;};
void
print
(person& a)
友元函式的一種實現就是上面需求中的外部函式。
友元函式的另一種實現為:在另乙個類中的成員函式(也叫友元成員,友元成員方法,友元成員函式)
#include
#include
using
namespace std;
//類的前置宣告
class
food
;class
person
;person
(string name)
:name
(name)
;void
eat(food&tmp);}
;class
food
;food
(string name)
:name
(name)
;friend
void person::
eat(food&tmp)
;private
:int x;
protected
:int y;};
void person::
eat(food&tmp)
intmain
(void
)
總結:
理解編譯器的工作原理和「脾氣」,很多事自然就很簡單了。在設計多個類的體系時,盡量設計好層次關係成單向的,盡量避免互相引用的情況
將類a
宣告為b
中的友元類後,則a
中所有成員函式都成為類b
的友元函式了。要注意:友元類的定義和使用友元類是單向的。
舉個栗子:
#include
#include
using
namespace std;
class
food
;food
(string name)
:name
(name)
;//在food類中宣告友元類person
friend
class
person
;private
:int x;
protected
:int y;};
class
person
;person
(string name)
:name
(name)
;void
eat(food&tmp)};
intmain
(void
)
兩個個類可以互為友元類,互為友元類要注意互相引用的細節規則。
運算子過載使用方法參考:[c++學習筆記:運算子過載]。
並非所有運算子過載都可用友元函式,有四個運算子 =, ->, , ()就不可以。
類內的資料其實就是類的成員變數。
2個類共享資料方法(準確的說是兩個物件交換資料):
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...