友元函式和友元類

2021-09-07 16:59:51 字數 4328 閱讀 8007

一、友元介紹

我們知道,類的成員函式可以訪問同類的其他成員函式,包括公有、私有和保護成員。而類的外部函式只能訪問類的公有成員。

友元是一種允許非類成員函式訪問類的非公有成員的一種機制。

可以把乙個函式指定為類的友元,也可以把整個類指定為另乙個類的友元。

友元函式

友元類

二、友元函式

友元函式在類作用域外定義,但它需要在類體中進行說明

為了與該類的成員函式加以區別,定義的方式是在類中用關鍵字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開始,它只能出現在類定義的內部,友...