新闻中心

c++中友元(friend)是什么意思_讲解C++中友元(friend)函数与类的作用

2025-11-01
浏览次数:
返回列表
友元函数可访问类的私有成员,如printWidth能直接使用Box的width,通过friend声明实现跨类数据共享。

c++中友元(friend)是什么意思_讲解c++中友元(friend)函数与类的作用

在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) {
    // 可以访问私有成员 width
    std::cout << "Width is: " << box.width << std::endl;
}

在这个例子中,printWidth 不是 Box 类的成员函数,但由于被声明为 friend,它可以访问 Box 的私有成员 width

友元类的作用与用法

如果一个类被声明为另一个类的友元类,那么这个友元类的所有成员函数都可以访问原类的私有和保护成员。

短影AI 短影AI

长视频一键生成精彩短视频

短影AI 170 查看详情 短影AI 示例:
class Storage {
private:
    int secret;
public:
    Storage(int s) : secret(s) {}

    // 声明 FriendClass 为友元类
    friend class FriendClass;
};

class FriendClass {
public:
    void display(Storage& s) {
        // 可以访问 Storage 的私有成员
        std::cout << "Secret value: " << s.secret << std::endl;
    }
};

这里,FriendClass 能够访问 Storage 类的私有变量 secret,因为 Storage 明确将其声明为 friend。

使用友元的注意事项

虽然友元提供了灵活性,但应谨慎使用,避免破坏面向对象编程中的封装性原则。

  • 友元关系不能被继承 —— 子类不会自动成为基类友元的友元。
  • 友元关系是单向的 —— 如果类 A 是类 B 的友元,不代表类 B 也能访问类 A 的私有成员。
  • 过度使用友元可能导致代码耦合度增高,降低可维护性。

基本上就这些。友元机制在需要紧密协作的类之间非常有用,比如容器与迭代器、工厂类与目标类之间的设计。只要合理使用,它能提升代码的清晰度和效率。不复杂但容易忽略的是:友元不是成员,也不受访问控制符影响,它的权限是明确授予的。

以上就是c++++中友元(friend)是什么意思_讲解C++中友元(friend)函数与类的作用的详细内容,更多请关注其它相关文章!


# 在这个  # 聊城营销推广价格  # 沾益区网站建设功能  # 佛山建设网站图片大全  # SEO一般月薪是多少  # 网络营销代理推广方式  # 数字营销推广方案案例  # 松江高端网站建设  # 莆田seo霸屏  # 推广营销爆文  # 山阳区营销推广  # c++  # 是一种  # 情况下  # 的是  # 如何使用  # 绑定  # 面向对象  # 子类  # 运算符  # 递归 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: html5 app怎么运行环境_配html5 app运行环境【教程】  AO3最新可访问网址 Archive of Our Own官方在线入口  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  C++如何解决segmentation fault_C++段错误调试与原因分析  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  Django通过AJAX异步上传图片并保存至模型的完整指南  深入理解Go语言中的指针类型:以*string为例  如何使用纯J*aScript判断Input元素是否在特定类容器内  必由学官网快捷入口 必由学网页版在线学习平台  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  J*aScript设计模式实践_j*ascript代码优化  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  解决Python logging 中 datefmt 导致时间戳固定不变的问题  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  学习通网页版官方登录 超星学习通电脑端入口指南  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  浏览器打开即用 美图秀秀网页版入口  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  批改网学生版PC登录 批改网官网登录系统入口  晋江读书网页版在线登录 晋江读书电脑版官网  c++ 命名空间怎么用 c++ namespace使用指南  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  BetterDiscord插件中安全更新用户简介的实践指南  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  微信网页版扫码登录入口 微信网页版二维码登录入口  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  妖精动漫免费平台 妖精动漫官网资源观看网址  理解J*aScript Promise的微任务队列与执行顺序  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  yy漫画网页版官方入口_yy漫画官网登录页面链接  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  Mac怎么使用表情符号_Mac Emoji快捷键面板  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法  理解Python模块与全局变量的作用域管理  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  mcjs网页版流畅运行 mcjs低配电脑畅玩入口 

搜索