什么是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

相关推荐

  • 反三角函数的导数怎么计算?,反三角函数求导公式是什么?

    反三角函数的导数本质上是通过反函数求导法则,将原本超越函数的求导问题转化为代数运算,核心结论是反三角函数的导数均为代数函数,即不含三角函数的有理式或根式,在高等数学体系中,反三角函数的导数是连接三角函数与代数函数的重要桥梁,掌握这些公式不仅是微积分考试的重点,更是后续学习微分方程、复变函数以及工程数学的基础,反……

    2026年7月14日
    2500
  • 负浮点数在计算机中如何存储,存储格式是什么?

    负浮点数在计算机中遵循IEEE 754标准存储,使用符号位、指数位和尾数位,其中指数位采用移码表示,这与整数补码存储完全不同,是理解浮点数精度和范围的关键,负浮点数在计算机中的存储原理是什么?要理解负浮点数在计算机中是如何存储的,得从IEEE 754标准说起,这个标准由电气和电子工程师协会制定,现代CPU和几乎……

    2026年7月26日
    2000
  • 房产小程序有哪些功能和使用方法?,开发费用多少?

    房产小程序的核心价值在于将线下看房流程线上化,实现房源展示、客户留资和实时沟通,但开发前必须搞清楚功能需求、预算范围和上线周期,否则容易花冤枉钱, 房产小程序的选择应从业务场景出发,先确定核心功能,再匹配开发方式,最后用运营数据验证效果,这样才可能真正实现降本增效,房产小程序开发费用构成:从模板到定制怎么选模板……

    2026年7月22日
    1600
  • flex云私人服务器怎么用?flex云私人服务器租用费用高吗

    Flex云私人服务器通过容器化技术实现资源隔离与弹性伸缩,适合对数据安全、性能稳定性及成本可控性有高要求的开发者与中小企业,其核心优势在于无需管理底层硬件即可享受接近裸金属的性能体验,在云计算市场日益成熟的今天,选择一款合适的云主机不再是单纯比拼CPU主频或内存大小,而是看谁能提供更灵活的资源调度能力和更透明的……

    2026年7月8日
    18600
  • AI Logo大模型怎么用?AI生成logo哪个软件免费

    AI Logo大模型能通过输入文字描述自动生成专业级品牌标识,大幅降低设计成本并提升效率,是中小企业和初创团队构建视觉识别系统的最佳选择,为什么2026年AI Logo大模型成为设计新标配在2026年的商业环境中,品牌视觉形象的建设速度直接关联市场响应能力,传统设计流程往往需要经历需求沟通、初稿修改、定稿交付等……

    2026年6月16日
    3500
  • FFmpeg使用手册核心功能有哪些?,怎么用

    FFmpeg是视频处理领域最强大的命令行工具,掌握其核心用法能让你独立完成视频剪辑、格式转换、压缩合并等绝大部分日常任务,基础操作与核心命令掌握FFmpeg的起点是理解它的命令骨架,无论处理哪种文件,命令结构都遵循同一模式:输入文件、输出文件,中间插入若干参数,从安装到第一个成功转换,只需要几分钟,FFmpeg……

    2026年7月15日
    1700
  • AI大模型入门任务怎么做?零基础如何快速掌握AI大模型

    AI大模型入门并非遥不可及,核心在于掌握提示词工程、理解模型边界并选择适合个人预算的API服务,即可快速构建实用应用,理解AI大模型的本质与能力边界很多人误以为AI大模型是一个全知全能的“神”,实际上它更像是一个读过互联网上几乎所有书籍、但偶尔会“幻觉”的超级实习生,理解这一点,是入门的第一步,业内专家指出,大……

    2026年6月14日
    2600
  • IP地址解析是怎样解析的,什么是收货地址解析?

    IP地址解析的本质是将人类易记的域名转换为机器可读的IP地址,而收货地址解析则是将杂乱无章的自然语言文本转换为标准化的结构化字段,两者看似同名“解析”,实则一个属于网络协议层,一个属于应用智能层,但核心逻辑相通:都是将非结构化信息映射为结构化数据,从域名到IP:解析的底层逻辑说起IP地址解析,绝大多数人第一反应……

    2026年8月18日
    4300
  • iOS应用程序怎么做漏洞扫描,有什么好用的工具?

    iOS应用程序做漏洞扫描不是一道选择题,而是上架前必须完成的“体检”,核心方案是自动化扫描工具配合人工渗透测试,两者结合才能覆盖从代码层到业务层的完整风险面,iOS APP安全检测怎么收费——先搞懂钱花在哪再谈预算很多团队第一次咨询iOS漏洞扫描时,第一句话就是“做一次多少钱”,其实这个报价弹性极大,从几百块到……

    2026年8月20日
    700
  • 大模型训练功耗有多大?大模型训练需要多少电

    大模型训练功耗极大,单模型训练能耗可达数百万千瓦时,相当于数千户家庭一年的用电量,且随着参数规模指数级增长,电力成本已成为制约AI发展的核心瓶颈,大模型训练功耗有多大:从数据中心到芯片的微观视角在讨论大模型训练功耗时,我们往往只看到服务器机房里闪烁的指示灯,却忽略了背后庞大的能源消耗链条,这种消耗并非线性增长……

    2026年6月22日
    2600

发表回复

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