一、友元介紹
我們知道,類的成員函式可以訪問同類的其他成員函式,包括公有、私有和保護成員。而類的外部函式只能訪問類的公有成員。
友元是一種允許非類成員函式訪問類的非公有成員的一種機制。
可以把乙個函式指定為類的友元,也可以把整個類指定為另乙個類的友元。
友元函式友元類
二、友元函式
友元函式在類作用域外定義,但它需要在類體中進行說明
為了與該類的成員函式加以區別,定義的方式是在類中用關鍵字friend說明該函式,格式如下:
friend 型別 友元函式名(參數列);友元的作用在於提高程式的執行效率
友元函式注意事項:
1、友元函式不是類的成員函式,在函式體中訪問物件的成員,必須用物件名加運算子「.」加物件成員名。但友元函式可以訪問類中的所有成員(公有的、私有的、保護的),一般函式只能訪問類中的公有成員。
2、友元函式不受類中的訪問許可權關鍵字限制,可以把它放在類的公有、私有、保護部分,但結果一樣。
3、某類的友元函式的作用域並非該類作用域。如果該友元函式是另一類的成員函式,則其作用域為另一類的作用域,否則與一般函式相同。
4、友元函式破壞了物件導向程式設計類的封裝性,所以友元函式如不是必須使用,則盡可能少用。或者用其他手段保證封裝性。
c++ code 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include
#include
using namespace std;
class point
;point::point(int x, int y) : x_(x), y_(y)
double distance(const point &p1, const point &p2)
int main(void)
程式中distance 是point類的友元函式,可以訪問類的私有資料成員。
三、友元類
如果某類b的成員函式會頻繁的訪問另乙個類a的資料成員, 而a的資料成員的private/protectd限制造成b訪問的麻煩, b只能通過a的public的成員函式進行間接訪問
把b做成a類的友元類,即a類向b類開放其private/protectd內容, 讓b直接訪問
友元類:乙個類可以作另乙個類的友元
友元類的所有成員函式都是另乙個類的友元函式
友元類的宣告:
friend class 類名;
友元類注意事項:
1、友元關係是單向的
2、友元關係不能被傳遞
3、友元關係不能被繼承
telecontroller.h :
c++ code 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef _tele_controller_h_
#define _tele_controller_h_
class television;
class telecontroller
;#endif // _tele_controller_h_
telecontroller.cpp :
c++ code 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "telecontroller.h"
#include "television.h"
void telecontroller::volumeup(television &tv)
void telecontroller::volumedown(television &tv)
void telecontroller::chanelup(television &tv)
void telecontroller::chaneldown(television &tv)
television.h:
c++ code 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef _television_h_
#define _television_h_
class telecontroller;
class television
;#endif // _television_h_
television.cpp:
c++ code 1
2
3
4
5
6
#include "television.h"
television::television(int volume, int chanel) : volume_(volume), chanel_(chanel)
main.cpp:
c++ code 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "television.h"
#include "telecontroller.h"
#include
using namespace std;
int main(void)
將telecontroller 類作為television類的友元類,這樣telecontroller 類的成員函式就都可以訪問television類的所有成員,包括私有。
參考:c++ primer 第四版
effective c++ 3rd
c++程式設計規範
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
C 友元 友元函式 友元類和友元成員函式
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...