0

0

c++中的友元类(friend class)怎么用_c++友元类机制与访问权限解析

尼克

尼克

发布时间:2025-10-23 20:15:02

|

442人浏览过

|

来源于php中文网

原创

友元类是指通过friend关键字声明的类,可访问目标类的私有和保护成员。例如Container类声明Iterator为友元后,Iterator能直接访问其私有数据data和size。友元关系具有单向性、不可继承性和不可传递性,且声明位置不影响其作用。主要用于迭代器与容器、工厂模式及紧密耦合的辅助类间交互。但过度使用会破坏封装性,应优先考虑友元函数以降低耦合,确保代码安全与可维护性。

c++中的友元类(friend class)怎么用_c++友元类机制与访问权限解析

在C++中,友元类(friend class)是一种特殊的机制,允许一个类访问另一个类的私有(private)和保护(protected)成员。这种设计打破了封装的限制,但使用得当可以提升类之间的协作效率,特别是在需要紧密配合的类之间。

什么是友元类?

友元类是指在一个类中通过 friend 关键字声明的另一个类。被声明为友元的类可以访问当前类的所有成员,包括 private 和 protected 成员。

例如,假设我们有两个类:Container 和 Iterator。Iterator 需要访问 Container 的内部数据结构才能正确遍历元素。这时就可以将 Iterator 声明为 Container 的友元类。

如何定义友元类?

在类定义中使用 friend class 类名; 语法即可声明友元类。

立即学习C++免费学习笔记(深入)”;

class Container {
private:
    int data[100];
    int size;

public: // 声明 Iterator 为友元类 friend class Iterator;

Container() : size(0) {}
void add(int value) {
    if (size < 100) {
        data[size++] = value;
    }
}

};

Giiso写作机器人
Giiso写作机器人

Giiso写作机器人,让写作更简单

下载
class Iterator {
    Container* container;
    int index;

public: Iterator(Container* c) : container(c), index(0) {}

bool hasNext() {
    return index < container->size;  // 直接访问 private 成员 size
}

int next() {
    return container->data[index++]; // 直接访问 private 数组 data
}

};

在这个例子中,Iterator 类虽然不是 Container 的成员,但由于被声明为友元,它可以自由访问 Container 的私有成员 data 和 size。

友元类的访问权限特性

  • 友元关系是单向的:如果 A 是 B 的友元类,B 不一定是 A 的友元。上面的例子中,Iterator 可以访问 Container,但 Container 不能访问 Iterator 的私有成员。
  • 友元关系不能继承:基类的友元类不会自动成为派生类的友元。
  • 友元关系不具备传递性:A 是 B 的友元,B 是 C 的友元,并不意味着 A 是 C 的友元。
  • 友元声明可以出现在类中的任何位置(public、private 或 protected 区域),效果相同。

使用场景与注意事项

友元类适用于以下情况:

  • 迭代器与容器:如 STL 中的设计,迭代器需要深入访问容器的内部结构。
  • 工厂类创建对象:某些工厂类需要调用类的私有构造函数来创建实例。
  • 紧密耦合的辅助类:如节点类与链表管理类之间需要共享内部状态。

但需要注意:

  • 过度使用友元会破坏封装性,降低代码的安全性和可维护性。
  • 应尽量避免将整个类声明为友元,若只需访问特定函数,可考虑使用友元函数代替。
  • 在设计时应明确友元的用途,并通过注释说明其必要性。

基本上就这些。友元类是一个有力但需谨慎使用的工具,理解其机制有助于写出更灵活又不失安全的C++代码。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

536

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

21

2026.01.06

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

465

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

什么是低代码
什么是低代码

低代码是一种软件开发方法,使用预构建的组件可快速构建应用程序,无需大量编程。想了解更多低代码的相关内容,可以阅读本专题下面的文章。

284

2024.05.21

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

4

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.9万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号