0

0

C++ friend类怎么定义 C++友元类访问私有成员示例【关系】

穿越時空

穿越時空

发布时间:2026-01-27 11:43:02

|

324人浏览过

|

来源于php中文网

原创

友元类是单向授权,A声明B为friend后B可访问A的私有成员,但A不能访问B的;声明必须在A类定义体内,用friend class B;形式,前置声明class B;即可;友元关系不可继承,且不授予对private构造/析构函数的调用权。

c++ friend类怎么定义 c++友元类访问私有成员示例【关系】

friend 类声明必须写在类内部

友元类不是“互相友好”,而是单向授权:A 声明 B 为 friend,B 就能访问 A 的私有成员,但 A 不能因此访问 B 的私有成员。声明位置很关键——friend 关键字必须出现在被访问类(比如 ClassA)的定义体内,且通常放在 privateprotected 区域里,但它本身不改变访问级别。

常见错误是把 friend class B; 写在类外面,或者写成 friend B;(漏掉 class 关键字,C++ 要求显式写出类型类别)。

  • friend class B; 是合法声明;friend B; 编译报错:'B' does not name a type
  • 前置声明足够:如果 BA 定义前未完全定义,只需在 A 上方加 class B; 即可
  • 友元关系不可继承:即使 BA 的 friend,B 的派生类也不能访问 A 的私有成员

友元类能直接访问 private 成员,无需 public 接口

一旦声明成立,友元类的**任何成员函数**(包括构造函数、静态函数、const 成员函数)都能像访问自己成员一样读写目标类的 privateprotected 成员,不需要 getter/setter,也不受封装限制。

示例中,class Printerclass Data 的 friend,那么 Printer::print() 可以直接写 d.m_value(假设 m_valueData 的 private 成员),而普通函数或非友元类只能通过 Data 提供的 public 方法间接访问。

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

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载
  • 友元函数同理,但只限于那个函数;友元类则授权整个类的所有成员函数
  • 注意:友元不授予对 private 构造函数/析构函数的调用权——除非你显式在友元类中调用,且该构造函数可访问(例如不是 delete 或 private 继承导致不可见)
  • Data 的私有成员是另一个类的 private 成员(如嵌套类),友元关系不自动穿透;Printer 仍不能直接访问 Data::Inner::m_x,除非 Inner 也声明 Printer 为 friend

友元破坏封装,但适合紧密耦合场景

典型适用场景是两个类逻辑上高度内聚,比如容器与迭代器(std::vector 和它的 iterator)、Pimpl 惯用法中的接口类与实现类、或序列化辅助类。这时候强行加 public 接口反而暴露不该暴露的细节,或引入不必要的性能开销(比如拷贝返回值)。

  • 不要为图省事给业务逻辑类随便加 friend——它会让类的契约变得模糊,增加维护成本
  • 友元声明不会影响二进制兼容性,但会扩大 ABI 影响范围:修改 Data 的私有成员布局,可能迫使所有 friend 类重新编译
  • 模板类做友元时需谨慎:友元可以是具体特化(friend class Helper<int>;),也可以是全特化模板(template<typename T> friend class Helper;),后者权限更大,也更难追踪

编译器不检查友元访问是否合理

C++ 编译器只验证语法和可见性,不管语义是否“合理”。比如 PrinterData 的 friend,它就能在 print() 里把 d.m_value = 42;,哪怕这违反了 Data 的不变量(invariant)。这种越权修改容易埋下 bug,调试时也难以定位——因为错误发生在友元类里,而问题根源其实在被访问类的约束被绕过。

  • 没有运行时检查,也没有 warning 提示“你在滥用 friend”
  • 单元测试要覆盖友元类对私有状态的修改路径,否则很容易漏掉非法状态
  • Clang-Tidy 有 cppcoreguidelines-non-private-member-variables-in-classes 等规则,但对 friend 访问无能为力;静态分析工具很难补这个缺口

真正麻烦的不是怎么写 friend,而是后续谁来保证 Printer 不会悄悄改坏 Data 的内部一致性——这得靠设计约定、代码审查和测试覆盖,编译器帮不上忙。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

564

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

614

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

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

335

2025.08.29

C++中int的含义
C++中int的含义

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

235

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1958

2023.10.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共58课时 | 6万人学习

ASP 教程
ASP 教程

共34课时 | 5.9万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

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

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