MST

星途 面试题库

面试题:C++ 友元机制访问非公有成员的深度理解

已知在C++里可以利用友元函数或友元类来访问类的非公有成员。请详细阐述友元函数和友元类在访问非公有成员时的区别与联系,并且说明友元机制可能带来的安全性问题以及如何在实际项目中尽量规避这些问题。
25.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 访问范围
    • 友元函数:只能访问类中明确声明为其可访问的非公有成员。它只是一个普通函数,被授予了访问特定类非公有成员的权限,对类的访问较为局部化。
    • 友元类:友元类的所有成员函数都可以访问授予其友元关系的类的非公有成员。访问范围更广,涵盖了友元类内所有成员函数对目标类非公有成员的访问。
  2. 定义位置
    • 友元函数:可以在类定义内部声明,但通常在类外部定义,定义时不需要像成员函数那样使用类名::限定符。
    • 友元类:在类定义内部声明,一般在类的开头或结尾处声明,表示整个类具有访问权限。

联系

  1. 目的相同:两者都是C++为了提供一种突破类封装性的机制,使特定的函数或类能够访问其他类的非公有成员,以满足一些特殊的编程需求,比如类之间紧密的合作关系。
  2. 声明方式:都需要在目标类的定义中进行声明,明确授予访问权限。

安全性问题

  1. 破坏封装性:友元机制打破了类的封装原则,使得非公有成员可以被外部函数或类访问,增加了数据被误修改或滥用的风险。如果友元函数或友元类被恶意使用,可能会破坏类的内部数据一致性。
  2. 难以维护:过多使用友元机制会使类之间的关系变得复杂,增加代码的维护难度。因为友元关系使得一个类的实现细节对其他类暴露,当目标类的非公有成员发生变化时,可能需要同时修改友元函数或友元类,导致代码耦合度增加。

规避方法

  1. 最小化友元使用:仅在必要时才使用友元机制,优先考虑通过类的公有接口来访问和操作数据。只有当确实无法通过其他合理方式实现类之间的协作时,才考虑使用友元。
  2. 限制友元范围:尽量使用友元函数而不是友元类,因为友元函数的访问范围相对较窄,可以更精确地控制对非公有成员的访问。如果必须使用友元类,也要确保友元类的功能紧密相关,避免授予不必要的访问权限。
  3. 文档说明:对使用友元机制的代码进行详细的文档注释,说明友元关系的目的、使用方法以及可能的影响。这样有助于其他开发人员理解代码,并在维护时注意潜在的风险。