新闻中心
C++ friend友元函数详解_C++封装性破坏与友元类使用场景
友元函数和友元类是C++中允许非成员函数或其他类访问私有和保护成员的机制,通过friend关键字声明,具有单向、非继承、非传递特性,在容器与迭代器、操作符重载等场景下提升灵活性与性能,应谨慎使用以避免破坏封装性。

在C++中,友元函数(friend function)和友元类(friend class)是两个特殊的机制,它们允许非成员函数或另一个类访问当前类的私有(private)和保护(protected)成员。虽然这看似破坏了面向对象编程中的封装性,但在特定场景下,这种设计能带来更高的灵活性和性能。
什么是友元函数?
友元函数不是类的成员函数,但它被声明为类的“朋友”,因此可以访问该类的所有成员,包括私有和保护成员。友元函数必须在类内部使用 friend 关键字进行声明。
例如:
class MyClass {
private:
int secret;
public:
MyClass(int s) : secret(s) {}
// 声明友元函数
friend void showSecret(const MyClass& obj);
};
// 友元函数定义
void showSecret(const MyClass& obj) {
std::cout << "Secret value: " << obj.secret << std::endl; // 可访问 private 成员
}
在这个例子中,showSecret 不是 MyClass 的成员函数,但通过 friend 声明,它可以访问 secret 成员。
友元函数是否破坏封装性?
从表面上看,友元函数确实绕过了类的封装机制,因为它可以直接读写私有数据。但这种“破坏”是有控制的、显式的,并不等同于将所有成员设为 public。
关键在于:友元关系是单向的、非继承的、非传递的。
MedPeer科研绘图
生物医学领域的专业绘图解决方案,告别复杂绘图,专注科研创新
166
查看详情
- 单向:A 是 B 的友元,不代表 B 也是 A 的友元。
- 非继承:基类的友元不能访问派生类的私有成员。
- 非传递:A 是 B 的友元,B 是 C 的友元,A 不能访问 C 的私有成员。
正因为这些限制,友元机制在保持一定程度封装的同时,提供了必要的访问权限,属于可控的“例外”。
友元类的使用场景
当一个类需要频繁访问另一个类的私有成员时,可以将前者声明为后者的友元类。典型应用场景包括:
- 容器与迭代器:如 STL 中的容器类(vector、list)常将对应的迭代器类声明为友元,以便迭代器能直接访问内部数据节点。
- 操作符重载需求:比如实现两个不同类之间的复合运算,其中一个类需要访问另一个类的私有数据。
- 工厂模式或管理类:某些管理类负责创建、配置或监控目标类的实例,可能需要深入访问其内部状态。
示例:友元类用法
class Storage {
private:
int data;
public:
Storage(int d) : data(d) {}
// 允许 Display 类访问私有成员
friend class Display;
};
class Display {
public:
void display(const Storage& s) {
std::cout << "Data: " << s.data << std::endl; // 直接访问 private
}
};
使用建议与注意事项
尽管友元功能强大,但应谨慎使用,避免滥用导致维护困难。
- 只在确实需要访问私有成员且无法通过公有接口实现时才使用友元。
- 优先考虑提供公共 getter/setter 方法,而不是开放友元权限。
- 避免将整个类设为友元,如果只需一个函数访问,就只声明该函数为友元。
- 注意友元声明的位置无关性:无论写在 public、private 还是 protected 区域,效果相同。
基本上就这些。友元不是“坏东西”,而是一种在封装与效率之间权衡的工具。合理使用,能让代码更清晰高效。
以上就是C++ friend友元函数详解_C++封装性破坏与友元类使用场景的详细内容,更多请关注其它相关文章!
# c++友元
# 工具
# c++
# 面向对象编程
# 友元函数
# 虎丘外贸网站推广服务
# 徐汇区餐厅营销推广中心
# 山西网络营销推广方案ppt
# seo优化研究中心
# 网站建设商务的术语
# 微网站建设报价
# seo效果不佳
# 郑州搜狗seo方法
# 东宝seo推广哪里有
# 吉林营销推广招商
# 在这个
# 运算符
# 如何判断
# 管理类
# 有什么区别
# 绑定
# 自定义
# 设为
# 迭代
# 面向对象
# 封装性
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
不同用户不同价格! 索尼开启账户个性化定价测试
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
抖音网页版平台入口 抖音网页版官网在线访问教程
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
QQ网页版官方账号入口 QQ网页版网页版登录指南
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
163邮箱登录密码 163邮箱忘记密码找回
Node.js中HTML按钮与J*aScript函数交互的正确姿势
qq音乐在线播放入口_qq音乐电脑版登录链接
BetterDiscord插件中安全更新用户简介的实践指南
怎么在mac上运行html代码_mac运行html代码方法【指南】
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
邮政快递单号查询入口 邮政快递物流信息在线查询入口
Go语言中的*string:深入理解字符串指针
css绝对定位元素脱离父容器怎么办_确保父元素position非static
一加 14R 快充无反应_一加 14R 充电优化
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
铃兰之剑为这和平的世界希里技能组及加点推荐
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
顺丰国际快递查询 国际件官方查询入口
poki网页游戏推荐_poki免费游戏平台入口
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
4399免费游戏网址入口 4399小游戏免费入口点开即玩
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
zookeeper 都有哪些功能?
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】
深入理解Go语言中的指针类型:以*string为例
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】
163邮箱注册官网 免费申请163个人邮箱
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
期待已久:小米17 Ultra、小米首款NAS本月登场
如何在CSS中使用浮动制作导航栏_float实现水平菜单
生成rdflib自定义SPARQL函数:参数匹配与实践指南
优化Log4j2控制台输出性能:解决异步日志瓶颈
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
百度网盘网页版入口 百度网盘网页版官方登录网址
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】


2025-12-04
浏览次数:次
返回列表