什么是friend友元函数?友元函数访问私有成员有哪些限制

在 C++ 中,友元函数(Friend Function) 是一种特殊的函数,它虽然不是某个类的成员函数,但被该类授权访问其私有(private)和保护(protected)成员。


为什么需要友元函数?

C++ 的核心特性之一是封装性:将数据(成员变量)和行为(成员函数)绑定在一起,并隐藏内部实现细节。

【一听就懂】友元函数和友元类!在C++中,友元(friend)是一个特殊的机制,一个视频让你好好认识它们!
加载中
【一听就懂】友元函数和友元类!在C++中,友元(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: " << obj.secret << std::endl;
}
int main() {
    MyClass obj(42);
    displaySecret(obj);  // 输出: Secret: 42
    return 0;
}

什么是friend友元函数?友元函数访问私有成员有哪些限制

友元函数的特点

特点说明
不是成员函数友元函数在类外定义,没有 this 指针
可访问私有/保护成员被 friend 声明后,可访问该类的所有私有和保护成员
破坏封装性使用友元会削弱类的封装性,应谨慎使用
声明方式在类内部用 friend 关键字声明,定义在类外

友元函数的常见用途

重载运算符(尤其是流插入/提取运算符)

#include <iostream>using namespace std;class Complex {private:    double real, imag;public:    Complex(double r = 0, double i = 0) : real(r), imag(i) {}    // 友元函数用于重载 << 运算符    friend ostream& operator<<(ostream& os, const Complex& c);};ostream& operator<<(ostream& os, const Complex& c) {    os << "(" << c.real << " + " << c.imag << "i)";    return os;}int main() {    Complex c(3.0, 4.0);    cout << c << endl;  // 输出: (3 + 4i)    return 0;}

什么是friend友元函数?友元函数访问私有成员有哪些限制

两个类之间共享私有数据

class B;  // 前置声明
class A {
private:
    int value;
public:
    A(int v) : value(v) {}
    // B 的成员函数可以访问 A 的私有成员
    friend void B::showA(const A& a);
};
class B {
public:
    void showA(const A& a) {
        cout << "A's value: " << a.value << endl;  // 合法
    }
};

全局函数访问类的私有成员

class Box {
private:
    double width;
public:
    Box(double w) : width(w) {}
    friend double getWidth(const Box& b);
};
double getWidth(const Box& b) {
    return b.width;  // 合法
}

友元函数 vs 成员函数

什么是friend友元函数?友元函数访问私有成员有哪些限制

对比项 友元函数 成员函数
是否属于类 否 是
是否有 this 指针 无 有
访问权限 可访问私有/保护成员 可访问私有/保护成员
调用方式 普通函数调用 对象.函数() 或 对象->函数()
封装性影响 削弱封装 保持封装

注意事项

  1. 谨慎使用:友元函数破坏了封装性,应仅在必要时使用。
  2. 不是继承的:友元关系不能继承。
  3. 可声明多个友元:一个类可以有多个友元函数或友元类。
  4. 友元类:除了友元函数,还可以将整个类声明为友元类(friend class ClassName;)。

  • 友元函数是 C++ 中一种打破封装的机制,允许非成员函数访问类的私有成员。
  • 常见用途包括重载运算符、跨类数据共享等。
  • 使用友元函数时应权衡封装性与便利性,避免滥用。

如有具体场景或代码问题,欢迎进一步提问!

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/484834.html

赞 (0)
Nginx Linux优化怎么做?linux系统性能调优技巧
上一篇 2026年7月12日 03:55
C语言fabs函数怎么用?c语言fabs函数用法
下一篇 2026年7月12日 03:56

相关推荐

  • 服务器物理地址查询的常用方法有哪些,怎么查

    服务器物理地址查询的核心是通过IP定位、MAC地址解析或机房信息API获取设备所在的地理位置,具体方法需根据查询目标和场景选择,目前主流方案已覆盖从城市级到机柜级的不同精度需求,服务器物理地址查询的本质与场景服务器物理地址在不同语境下有不同含义,对多数运维人员来说,它指服务器IP地址对应的地理位置;对网络管理员……

    2026年7月20日
    2600
  • IIS服务器怎么正确安装,具体步骤是什么?

    IIS安装并不复杂,但选错版本或漏掉关键组件会导致网站无法运行,本文按操作系统版本拆解完整流程,并附失败排查与PHP环境配置方案,安装前先确认这两件事IIS(Internet Information Services)是Windows系统自带的Web服务器组件,多数情况下无需额外下载,动手前先确认系统版本和已安……

    2026年8月13日
    1200
  • 服务器安全培训有哪些核心内容?企业网络安全防护体系怎么搭建

    服务器安全培训的核心在于将抽象的安全理念转化为可执行的日常操作规范,通过建立“预防为主、响应为辅”的防御体系,显著降低数据泄露风险并保障业务连续性,很多企业管理者认为买了防火墙就万事大吉,这种想法在2026年的网络环境下显得过于天真,黑客攻击手段早已从简单的暴力破解演变为针对业务逻辑的复杂渗透,服务器不再是孤立……

    2026年7月11日
    5200
  • 业务集中城市,IDC企业有必要用CDN吗?,如何选择

    对于IDC企业而言,是否需要开展CDN业务,核心取决于客户对访问体验和可靠性的要求,即使业务集中在一个城市,CDN仍然能够解决跨运营商延迟、抵御突发流量冲击,并为企业未来的边缘计算服务铺路,IDC企业开展CDN业务有必要吗很多IDC企业的管理者会问:我的机房就在本地,客户也大多是同城企业,CDN是不是只有全国性……

    2026年8月2日
    700
  • 怎么查询域名解析IP地址?,域名解析是什么意思?

    域名解析是将域名映射到IP地址的核心网络服务,通过查询公共或本地DNS服务器,用户可以快速获取域名对应的IP地址,这是网站访问和网络诊断的基础,ip地址域名解析怎么查?——从基础到实操域名解析听起来复杂,实际就是你的设备在访问网站时,先去问DNS服务器“这个域名对应的IP是什么”,然后拿到IP地址再建立连接,整……

    AI资讯 2026年8月6日
    1700
  • 大模型推理用什么框架最快?主流大模型推理框架对比

    在2026年的技术生态中,若追求极致的推理速度,vLLM依然是大多数生产环境的首选,而针对特定硬件优化后的TensorRT-LLM则在延迟敏感型场景中占据统治地位,选择大模型推理框架并非简单的“二选一”,而是需要根据你的硬件底座、模型类型以及业务对延迟的容忍度来综合决策,很多开发者容易陷入“最新框架一定最快”的……

    2026年6月22日
    1700
  • 大模型ROUGE评测指标是什么?如何计算ROUGE评分

    ROUGE评测指标是衡量大模型生成文本与参考文本重叠程度的自动化评估方法,核心通过计算召回率、精确率和F1值来量化生成内容的质量,在自然语言处理领域,尤其是大语言模型(LLM)的落地应用中,如何客观、高效地评估生成结果的好坏,始终是一个核心痛点,人工评估虽然准确,但成本高昂且难以规模化;而ROUGE(Recal……

    2026年6月21日
    2410
  • 国产AI大模型突破了吗?国内AI大模型最新进展

    国产AI大模型已实现从“跟随”到“并跑”乃至部分领域“领跑”的关键跨越,核心能力在中文理解、多模态交互及行业垂直应用上取得实质性突破,显著降低了企业智能化转型门槛,国产大模型技术底座实现质的飞跃过去几年,国内人工智能领域经历了从单纯模仿到自主创新的深刻变革,主流国产大模型在参数量级、训练效率以及推理速度上均达到……

    2026年6月14日
    3910
  • if嵌套与聚集函数嵌套怎么用?,有哪些技巧?

    在SQL查询中,IF嵌套和聚集函数嵌套是两种核心的高级写法,它们分别处理条件分支与数据聚合,组合使用能实现复杂业务逻辑,但写法不当会直接拖慢查询性能,在实际的数据库开发中,很多人会纠结于“条件判断怎么嵌套”和“聚合函数怎么嵌套用”,甚至把这两个概念混为一谈,下面我们拆开来看,弄清楚它们各自擅长什么,以及在实际工……

    2026年8月18日
    1300
  • 免登录AI大模型好用吗?国内免费AI大模型推荐

    无需注册账号、直接打开网页即可使用的AI大模型,是目前追求效率与隐私保护用户的首选工具,它通过简化访问流程,实现了“即开即用”的零门槛体验,在人工智能技术飞速迭代的当下,许多用户被繁琐的注册流程劝退,传统的AI服务往往要求手机号验证、邮箱确认甚至实名认证,这不仅增加了时间成本,还引发了对隐私泄露的担忧,而免登录……

    2026年6月13日
    3200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注