C++友元类

C++友元类友元类不仅可以将一个函数声明为一个类的 朋友 还可以将一个类 例如 B 类 声明为另一个类 例如 A 类 的 朋友 这时 B 类就是 A 类的友元类 友元类 B 中的所有函数都是 A 类的友元函数 可以访问 A 类中的所有成员 声明友元类的一般形式为 friendclass 类名 所以 可以在 A 类的定义体中 可以使用如下语句声明 B 类为其友元类 friendclassB 那么 类 B 是类 A 的友元类 所以 类 B 的成员函数就可以访问类 A 的私有成员

友元类

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

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

friend class 类名;

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

friend class B;

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

       如下是一个测试例子:

C++友元类

程序运行结果如下:

C++友元类

 

       可以看到,定义了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++隐藏的信息。从而提高获取对象信息的效率。

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229977.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:25
下一篇 2026年3月16日 下午3:25


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号