[C++ rudiment]关于类的友元
1
/*
2
Written By WangBin @09.6.11
3
Just for the understanding of the friend in C++
4
*/
5
/*
6
再注:为了能在友元函数中访问并设置类的私有数据成员,一个类的友元函数一般将该类的引用作为函数参数
7
友元关系是单方向的,不具有交换性和传递性,使用友元虽然可以简化编程,但却破坏了类的封装性,应谨慎使用才是
8
*/
9
#include <iostream>
10
using namespace std;
11
12
class A;
13
class B
14
{
15
public:
16
void BFunc(A&);
17
};
18
class C
19
{
20
public:
21
void CFunc(A&);
22
};
23
class A
24
{
25
//一般习惯于把一个类的所有友元函数放在类声明的开始或者结尾处
26
//声明一个普通函数为类A的友元函数,此函数可以访问类A的所有成员(包括私有成员)
27
friend void display(A&);
28
//声明一个类的成员函数为类B的友元函数,此函数可以访问A的所有成员(包括私有成员)
29
friend void B::BFunc(A&);
30
//声明类C是类A的友元类,类C中的成员函数都可以访问A的所有成员(包括私有成员)
31
friend C;
32
33
private:
34
int a;
35
int b;
36
public:
37
A(int x = 0,int y = 0)
38
{
39
a = x;
40
b = y;
41
}
42
};
43
void display(A& e)
44
{
45
cout<<"display()"<<endl;
46
//访问A的私有成员
47
cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
48
}
49
void B::BFunc(A& e)
50
{
51
cout<<"B::BFunc()"<<endl;
52
//修改A的私有成员
53
e.a = 10;
54
cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
55
}
56
void C::CFunc(A& e)
57
{
58
cout<<"C::CFunc()"<<endl;
59
//修改A的私有成员
60
e.b = 20;
61
cout<<"a = "<<e.a<<","<<"b = "<<e.b<<endl;
62
}
63
int main()
64
{
65
A a1(2,3);
66
display(a1);
67
B b1;
68
b1.BFunc(a1);
69
C c1;
70
c1.CFunc(a1);
71
return 0;
72
}

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

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

OutPut:
上面已经说过了,友元是单方向性的和非传递的,一个类设置基类A为友元,并不代表基类A的派生类也可以访问那个类的所有数据成员。非传递!
我没有什么雄心壮志,我只想给自己和关心自己的家人和朋友一个交代,仅此而已。