浅谈C++中的友元关系

在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

下面给一个简单的例程代码;

1#include<iostream>

2

3usingnamespacestd;

4

5classB;

6

7classA{

8private:

9intx;

10public:

11A();

12voiddisplay(B&);

13};

14

15classC;

16

17classB{

18private:

19inty;

20intz;

21public:

22B();

23B(int,int);

24friendvoidA::display(B&);//友元成员函数

25friendvoiddisplay(B&);//友元函数

26friendclassC;//友元类

27};

28

29classC{

30private:

31intsum;

32voidcalc(B&);

33public:

34C();

35voiddisplay(B&);

36};

37

38//必须在友元关系的类后进行定义

39voiddisplay(B&v)//友元函数

40{

41cout<<v.y<<""<<v.z<<endl;

42}

43

44A::A()

45{

46this->x=0;

47}

48

49voidA::display(B&v)//友元成员函数

50{

51this->x=v.y+v.z;

52cout<<this->x<<endl;

53}

54

55B::B()

56{

57this->y=0;

58this->z=0;

59}

60

61B::B(inty,intz)

62{

63this->y=y;

64this->z=z;

65}

66

67C::C()

68{

69sum=0;

70}

71

72voidC::display(B&v)

73{

74this->calc(v);

75cout<<sum<<"="<<v.y<<"+"<<v.z<<endl;

76}

77

78voidC::calc(B&v)

79{

80sum=v.y+v.z;

81}

82

83intmain()

84{

85A a;

86B b(2,3);

87display(b);

88a.display(b);

89C c;

90c.display(b);

91

92return0;

93}

94

原文链接: https://www.cnblogs.com/accepted/archive/2010/09/04/1818173.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14660

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午2:23
下一篇 2023年2月7日 下午2:24

相关推荐