什么是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://test.idctop.com/article/484834.html

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

相关推荐

  • 如何访问华为云服务器tomcat?华为云tomcat配置教程

    访问华为云服务器上的Tomcat,核心在于配置安全组放行8080端口,并在服务器内部启动Tomcat服务,确保防火墙与云控制台双重放行,很多开发者在将Java应用部署到华为云时,最常遇到的痛点就是“本地能跑,云端报错”,这通常不是代码逻辑的问题,而是网络连通性与服务状态的错位,要解决这个问题,我们需要从云端网络……

    2026年7月8日
    5800
  • 分布式管理系统是什么?分布式管理系统有哪些核心功能

    分布式管理系统通过解耦架构实现高可用与弹性伸缩,是应对海量数据与高并发场景的核心基础设施,而非简单的服务器堆砌,想象一下,如果你把整个公司的运营数据都锁在一个保险柜里,一旦钥匙丢了或者保险柜坏了,整个公司就瘫痪了,分布式管理系统就是那个拥有无数个小保险柜、并且能自动备份、自动切换的超级管家,它不再依赖单一节点的……

    2026年7月9日
    15100
  • fcntl在Unix中怎么用?fcntl函数详解及常见用法

    fcntl 是 Unix/Linux 系统中用于控制文件描述符属性的核心系统调用,它通过修改文件状态标志(如非阻塞模式、文件锁)来赋予程序对 I/O 操作的精细控制权,是构建高性能网络服务和并发系统的基石,在 Unix 哲学中,“一切皆文件”不仅是理念,更是实现方式,当你打开一个 socket、管道或普通文件时……

    2026年7月8日
    6600
  • IP购买时如何选择弹性公网IP池,价格多少合适

    购买弹性公网IP池,最佳策略是优先选择按流量计费模式,并与云资源同地域部署,这样既能控制成本又能保障网络质量,如果业务流量波动大,搭配共享带宽包可以进一步降低整体费用,弹性公网IP怎么买便宜?先看计费方式买IP最怕花冤枉钱,尤其是一开始就选了不适合的计费方式,弹性公网IP池的计费主要分两种:按流量和按带宽,选对……

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

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

    2026年6月14日
    2600
  • 李白ai翻译大模型好用吗,李白ai翻译大模型免费吗

    李白AI翻译大模型通过深度融合古诗文语境理解与现代NLP技术,实现了从“字面直译”到“文化意译”的跨越,是目前解决古诗词英译及跨文化文学交流痛点的最优解决方案,李白AI翻译大模型的核心优势解析为何传统翻译工具无法胜任古诗翻译在尝试将李白的《静夜思》或《将进酒》翻译成英文时,大多数用户会发现主流翻译软件往往给出令……

    2026年6月13日
    5200
  • 服务器log是什么意思?服务器日志怎么看

    服务器Log(日志)本质上是服务器记录自身运行状态、用户访问行为及系统事件的“黑匣子”文本文件,它是排查故障、分析流量和保障安全的唯一真实依据,当你在后台看到满屏滚动的代码或文字时,不要感到恐慌,这些看似杂乱无章的字符,实际上是服务器在向你“说话”,每一行Log都对应着一个具体的动作:谁来了、看了什么、是否成功……

    2026年7月10日
    6100
  • 服务器正忙无法访问是怎么回事,该怎么办?

    服务器正忙,本质是服务器资源不足以处理当前请求,通常是访问量过大、性能瓶颈或配置问题导致的,当你在浏览器或游戏界面看到“服务器正忙”的提示,背后是服务器在短时间内收到的请求超出了它的处理能力,就像一条单车道公路突然涌入大量汽车,堵车是必然结果,服务器资源包含CPU、内存、带宽、磁盘I/O,任何一个环节成为瓶颈……

    2026年7月26日
    1000
  • i5服务器租用_计费样例

    i5服务器租用的计费样例其实很简单,一台主流配置的月费大致在500-1200元之间,但具体价格取决于内存、带宽和机房线路,下面以一个典型配置为例,拆解各项费用的真实占比,i5服务器租用价格计费样例:月付500元能买到什么配置CPU与内存:计费的基石i5服务器租用价格首先看处理器代数,当前主流是i5-1240或i……

    2026年8月12日
    1000
  • 如何服务器端控制客户端?服务端控制客户端的技术实现

    服务器端控制客户端的核心在于通过服务端下发指令、校验状态并管理会话,而非直接操作客户端界面,这种架构确保了安全性、一致性与可维护性,在传统的C/S架构或早期的B/S架构中,开发者往往陷入一个误区,认为“控制”意味着直接修改前端的DOM结构或强制跳转页面,现代Web开发和移动端应用开发早已摒弃了这种粗暴的方式,真……

    2026年7月4日
    9200

发表回复

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