C++友元类
Posted LC编程开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++隐藏的信息。从而提高获取对象信息的效率。
读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。
以上是关于C++友元类的主要内容,如果未能解决你的问题,请参考以下文章