新闻中心
c++中的友元(friend)函数和友元类是什么_friend关键字的作用与访问控制解析
友元函数可访问类的私有成员。在C++中,通过friend关键字声明的函数能突破封装限制,如displaySecret函数可直接访问MyClass的private成员secret。

在C++中,friend关键字用于打破类的封装限制,允许某些外部函数或类访问当前类的私有(private)和保护(protected)成员。虽然封装是面向对象编程的重要原则,但在某些场景下,需要让特定函数或类获得额外的访问权限,这时友元机制就显得非常有用。
friend函数:让外部函数访问私有成员
一个普通函数如果被声明为某个类的友元函数,它就可以直接访问该类的私有和保护成员,即使它不是这个类的成员函数。
声明方式是在类内部使用friend关键字修饰函数原型:
class MyClass {
private:
int secret;
public:
MyClass(int s) : secret(s) {}
// 声明友元函数
friend void displaySecret(const MyClass& obj);
};
// 定义友元函数
void displaySecret(const MyClass& obj) {
std::cout << "Secret value: " << obj.secret << std::endl; // 可以访问private成员
}
注意:friend函数定义时不需要加作用域限定符(如MyClass::),因为它不属于类的成员函数。
friend类:让整个类拥有访问权限
有时我们需要让一个类完全访问另一个类的私有成员,这时可以将前者声明为后者的友元类。
Pinokio
Pinokio是一款开源的AI浏览器,可以安装运行各种AI模型和应用
232
查看详情
class Helper {
private:
int helperData;
public:
Helper(int h) : helperData(h) {}
void showData(const Sensitive& obj); // 将访问另一个类的私有成员
};
class Sensitive {
private:
int sensitiveValue;
public:
Sensitive(int v) : sensitiveValue(v) {}
// 声明Helper为友元类
friend class He
lper;
};
// Helper类的方法可以访问Sensitive的私有成员
void Helper::showData(const Sensitive& obj) {
std::cout << "Accessing sensitive data: " << obj.sensitiveValue << std::endl;
}
一旦声明,Helper类的所有成员函数都能访问Sensitive类的私有和保护成员。
访问控制与设计考量
friend关键字并不会改变类本身的访问控制规则,它只是提供了一种可控的“例外通道”。需要注意以下几点:
- 友元关系是单向的:A是B的友元,并不代表B也是A的友元
- 友元关系不能继承:基类的友元无法自动访问派生类的私有成员
- 友元关系不具有传递性:A是B的友元,B是C的友元,A仍不能访问C的私有成员
- 过度使用友元会破坏封装性,应谨慎使用,仅在确实需要时才引入
常见使用场景包括运算符重载(如
基本上就这些。friend机制提供了灵活性,但也要求开发者自觉维护设计的合理性。正确使用能提升代码可读性和效率,滥用则可能导致维护困难。
以上就是c++++中的友元(friend)函数和友元类是什么_friend关键字的作用与访问控制解析的详细内容,更多请关注其它相关文章!
# 不需要
# 宁国seo推广计划
# 想找机构或者网站做推广
# 抖音优化seo引擎
# SEO收录加速
# 深圳网站优化知识
# 查询你关注的关键词排名
# 公司合并关键词排名查询
# 学科专业网站建设
# 新手学习seo 分类
# 莆田网站建设模板下载
# c++
# 换行符
# 是在
# 访问权限
# 如何选择
# 自定义
# 数据结构
# 访问控制
# 面向对象
# 运算符
# 面向对象编程
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
PDF文件体积过大处理_PDF压缩技巧详解
铃兰之剑为这和平的世界希里技能组及加点推荐
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
一加 14R 快充无反应_一加 14R 充电优化
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
J*aScript map 迭代中检测空数组元素的有效方法
PostgreSQL海量数据高效导入策略:Python与Django实践指南
AO3中文官网链接_AO3网页版稳定镜像站
AO3官方可用镜像 Archive of Our Own网页版最新入口
夸克浏览器图书入口 夸克手机浏览器阅读入口
从J*aScript对象中精确提取指定属性的教程
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
如何使 Jest 模拟函数默认抛出错误以提高测试效率
Python Socket多播通信中指定源IP地址的实践指南
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
照顾宝贝2小游戏点击立即在线玩
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
2026春节假期票务安排_2026春节放假购票指南
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
c++ dfs和bfs代码 c++深度广度优先搜索算法
Mac终端命令大全_Mac常用Terminal指令速查
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
免费抖音短视频入口_抖音网页版短视频免费通道
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
J*aScript类型检查_j*ascript代码规范
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
Win11怎么开启高性能模式_Windows 11电源计划优化设置
解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常
在哪找SublimeJ远程工具_SFTP插件配置教程
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
网易大神账号申诉需要多久_网易大神账号申诉流程说明
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
qq游戏免费畅玩入口_qq游戏电脑版快速启动
深入理解J*a链表中的IPosition接口与使用
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
58动漫网在线官方网 58动漫网正版动漫入口网址


2025-10-29
浏览次数:次
返回列表
lper;
};
// Helper类的方法可以访问Sensitive的私有成员
void Helper::showData(const Sensitive& obj) {
std::cout << "Accessing sensitive data: " << obj.sensitiveValue << std::endl;
}