友元的友元类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了友元的友元类相关的知识,希望对你有一定的参考价值。

参考技术A

友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
定义友元类的语句格式如下:
friend class 类名(即友元类的类名); (1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。 即一个函数作为一个类的函数,同时又是另一个类的友元。
如果我们决定该函数必须作为一个类的成员函数,同时又是另一个类的友元,则成员函数声明和友元声明如下: class Window;class Screenpublic://copy是类Screen的成员Screen& copy(Window&);//...;class Window//copy是类Window的一个友元friend Screen& Screen::copy(Window&);//...;只有当一个类的定义已经被定义时,它的成员函数才能被声明为另一个类的友元。例如Screen 类必须把Window 类的成员函数声明为友元,而Window类必须把Screen 类的成员函数声明为友元。在这种情况下可以把整个Window类声明为Screen 类的友元。 class Window;class Screenfriend class Window;//...;Screen 类的非公有成员现在可以被Window 的每个成员函数访问。

C++友元类

友元类

       不仅可以将一个函数声明为一个类的“朋友”,还可以将一个类(例如 B类)声明为另一个类(例如 A类)的“朋友”。这时B类就是A类的友元类。友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。

       声明友元类的一般形式为:

friend class 类名;

       所以,可以在A类的定义体中,可以使用如下语句声明B类为其友元类:

friend class B;

       那么,类B是类A的友元类。所以,类B的成员函数就可以访问类A的私有成员。

       如下是一个测试例子:

程序运行结果如下:

 

       可以看到,定义了my_print类和student类。其中,在student类定义的时候,有:

friend class my_print; //声明友元类

       所以,声明my_print类是student类的友元类。那么,my_print类的成员函数,就可以访问student类的私有成员。

       所以,my_print::print()函数中,可以引用输出student类的name, addr等私有成员。

       注意:my_print::print()函数的定义,需要在student类的后面,具体原理可以参考“编译器对类提前声明的处理”章节。就是上一章节,已经说了编译对类提前声明的处理。

       有关友元,有下面两点需要说明:

(1) 友元的关系是单向的,而不是双向的。如果声明类A是类B的友元类,不等于类B也是类A的友元类。

(2) 友元的关系不能够传递,如果类B是类A 的友元,类C是类B的友元,并不等于类C就是类A的友元。

       在实际工作中,除非确实有必要,否则,一般并不把整个类声明为友元类。而只将确实有需要的成员函数声明为友元函数,这样更方便安全一些。

       有关友元利弊的分析:面向对象程序设计的一个基本原则是封装性和信息隐蔽,而友元却可以访问其他类中的私有成员,不能不说这是封装原则的一个小的破坏。但是,它能有助于数据共享,能提高程序的效率,在使用友元的时候,要注意到它的副作用,不用过多地使用友元,只有在使用它能使程序精炼,并大大提高程序的效率时才用友元。也就是说,要在数据共享和信息隐蔽之间选择一个恰当的平衡点。

总结

本章节我们学习了C++的友元特性,可以定义友元函数和友元类。

在面向对象编程的设计思想中,有一个重要的特性就是:信息的封装和隐藏;例如,C++提供了private关键字,可以定义C++类对象的成员类型,是“私有”属性,不可以被外界访问,从而降低对象之间传递消息的效率。

那么,为了提高对象之间传递消息的效率,就需要打破这种信息“隐藏”的特性。

所以,C++提供了友元的特性,可以解决这个问题。例如,C++声明一个函数是自己的“朋友(友元)”,那么,该函数就可以访问C++隐藏的信息。从而提高获取对象信息的效率。

读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。

 

以上是关于友元的友元类的主要内容,如果未能解决你的问题,请参考以下文章

5 友元类

关于声明定义前向声明include循环依赖普通友元函数友元类友元成员函数的总结

如果在a类中声明b类为他的友元类,到底是a是b的友元还是b是a的友元?

C++之:友元类

C++友元类

C++友元类