友元函数是定义在类外但能访问其私有和保护成员的普通函数。它通过在类内用friend关键字声明,实现特定函数对类成员的直接访问,如printWidth函数访问Box类的width成员。

在C++中,友元(friend)机制允许某些函数或类访问另一个类的私有(private)和保护(protected)成员。这种设计初衷是为了在保持封装性的前提下,提供必要的灵活性。然而,由于它打破了类的访问控制限制,很多人认为它破坏了面向对象编程中的封装性。
友元函数是定义在类外部的普通函数,但它被授予访问该类私有和保护成员的权限。友元函数不是类的成员函数,也不属于类的作用域,但它必须在类内部用 friend 关键字声明。
例如:
class Box {
private:
double width;
public:
Box(double w) : width(w) {}
friend void printWidth(Box box); // 声明友元函数
};
void printWidth(Box box) {
std::cout << "Width: " << box.width << std::endl; // 可以访问私有成员
}
这里,printWidth 不是 Box 的成员函数,但因为被声明为友元,可以直接访问 width。
一个类可以被声明为另一个类的友元类,这意味着该友元类的所有成员函数都可以访问目标类的私有和保护成员。
示例:
class Storage {
private:
int secret;
int password;
public:
Storage(int s, int p) : secret(s), password(p) {}
friend class DataProcessor; // 声明友元类
};
class DataProcessor {
public:
void showData(Storage& s) {
std::cout << "Secret: " << s.secret << ", Password: " << s.password << std::endl;
}
};
DataProcessor 类可以完全访问 Storage 的私有数据,这在某些协作紧密的类之间可能有用,但也增加了耦合度。
LongShot
LongShot 是一款 AI 写作助手,可帮助您生成针对搜索引擎优化的内容博客。
77
查看详情
封装的核心思想是隐藏对象的内部实现细节,只通过公共接口与外界交互。而友元机制直接绕过了这一原则:
从这个角度看,友元确实削弱了封装带来的安全性和模块化优势。
虽然友元有弊端,但在特定情况下仍有必要使用:
operator 需要访问类的私有成员进行输出
关键在于:是否真的没有其他替代方案?能否通过公共接口实现相同功能?
基本上就这些。友元是一个强大的工具,但就像指针一样,用得好能提升效率,滥用则会带来混乱。设计时应优先考虑封装,仅在必要时谨慎使用 friend。
以上就是C++中的友元(friend)函数和友元类_C++破坏封装性的friend机制的详细内容,更多请关注其它相关文章!
# 是一个
# 东莞电子网站优化软件
# 网站怎么做社群推广
# 小程序如何对接网站推广
# 短片的推广和营销
# 李俊采seo博客
# 酒吧营销推广方案ppt模板网站
# 东莞抖音seo运营品牌
# 微信精准营销微信推广
# 问答推广营销技巧
# 涞源网络营销推广
# 这一
# c++
# 管理类
# 第三方
# 但它
# 自定义
# 微软
# 重构
# 随机数
# 面向对象
# 封装性
# 作用域
# 面向对象编程
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程
抖音官网入口快速访问 抖音网页版账号注册解析
Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型
Dagster资产间数据传递与用户配置管理教程
PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】
yy漫画登录页面官方入口_yy漫画在线阅读网址入口
mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法
j*a中ArrayBlockingQueue的使用
行者app怎样导出日志
三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧
第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项
iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法
构建可配置的J*aScript加权点击计数器与共享总计功能
蛙漫2(台版)正版官网 2025免费网页版分享
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题
《原神》月之一版本新增书籍一览
以下哪一项是古代兵书三十六计中的计谋
荣耀magicv5怎么上手测评
精通VS Code多光标编辑以实现闪电般快速的修改
J*a实现任务清单管理_集合框架综合入门练手
《红果免费短剧》下载观看方法
使用document.execCommand实现Web文本编辑器加粗/取消加粗
太平年在哪个平台播出
抖音赚钱快速入门_新手必看的抖音赚钱步骤
Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南
Three.js中动态更换3D模型纹理的教程
荣耀盒子应用管理技巧
搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能
英雄联盟争者留名活动介绍
Python高效统计字典嵌套列表值在目标列表中的出现次数
动漫岛在线动漫网 动漫岛动漫在线观看官方入口
Lar*el 关联查询:同时筛选父表与子表数据的高效策略
聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道
Fedora怎么安装 Fedora Workstation安装步骤
todesk如何添加信任设备_todesk信任设备设置教程
J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解
ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程
MySQL多重JOIN技巧:高效关联同一表获取多角色信息
《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略
铁路12306入口 铁路12306官网版入口登录网址
Win11怎么开启HDR_Windows 11显示器画质增强设置
在Dash应用中自定义HTML标题和网站图标
mysql如何回滚事务_mysql ROLLBACK事务回滚方法
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日
XPath动态元素定位:如何精准选择文本内容变化的元素
铁路12306官网登录入口 铁路12306在线购票官方平台
歌词怎么展示在|直播|间视频号?有什么注意事项?
在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享
2025-11-29
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。