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

相关推荐

  • 服务器接入云数据库怎么操作?云数据库RDS连接配置教程

    服务器接入云数据库的核心在于通过内网或专线建立低延迟、高安全的连接通道,建议优先选择同地域部署以实现毫秒级响应并降低网络成本,将本地或公有云服务器与云数据库打通,不再是简单的IP配置,而是一场关于稳定性、安全性和成本控制的综合博弈,很多开发者在初期容易忽视网络架构的深层逻辑,导致后期运维成本飙升,业内专家指出……

    2026年7月8日
    1600
  • ai大模型下的小模型是什么?大模型和小模型的区别

    在AI大模型时代,小模型并非大模型的替代品,而是通过边缘部署、垂直领域微调及轻量化架构,在特定场景下实现更低延迟、更高隐私安全与更优成本效益的关键技术分支,过去两年,业界对“大模型万能论”的狂热逐渐降温,转而追求“够用且好用”的实用主义,当算力成本成为企业落地的最大瓶颈,当数据隐私成为合规红线,当实时响应成为用……

    AI资讯 2026年6月14日
    3010
  • ICMP接口限速告警出现故障怎么解决?,是什么原因导致的

    ALM-3276800103告警直接指向ICMP报文在接口遭遇限速,导致丢包和延迟,核心解决方法是调整接口下的ICMP限速参数或关闭限速功能,ICMP接口限速告警ALM-3276800103从何而来这个告警在华为交换机与路由器上并不陌生,它代表设备检测到某个接口接收的ICMP报文速率超过了预设的限速阈值,设备默……

    2026年8月11日
    1000
  • 网站建设公司服务范围有哪些?2026最新建站报价及流程

    选择网站建设公司时,核心在于明确自身业务目标并考察其全链路交付能力,而非单纯比较价格,建议优先选择能提供从SEO底层架构到后期运维一体化服务的专业团队,在数字化浪潮席卷各行各业的今天,企业官网早已不再是简单的“网络名片”,而是品牌信任背书、流量获取以及转化变现的核心阵地,许多企业主在寻找合作伙伴时,往往陷入盲目……

    2026年7月3日
    7410
  • 服务器监控客户端怎么用?服务器监控软件哪个好用

    “服务器监控客户端”通常指的是部署在被监控服务器(或主机)上的轻量级代理程序(Agent),或者是指用于远程监控服务器状态的客户端工具,根据你的具体需求,这个概念可能涵盖以下几个层面:核心概念Agent(代理/客户端):安装在目标服务器上的小型程序,负责收集本地指标(如 CPU、内存、磁盘、网络、进程等),并将……

    2026年7月10日
    12600
  • intel云_Intel MPI

    百度智能云上的Intel MPI是一套成熟的高性能计算消息传递库,凭借与至强处理器和RDMA网络的深度优化,成为并行计算和大规模科学仿真的首选方案,并且百度云控制台直接提供免费的一键部署能力,用户只需按计算资源付费,Intel MPI在百度智能云上的定位与优势云计算厂商构建HPC集群时,消息传递接口是打通多节点……

    2026年8月19日
    400
  • IDC上市公司比较函数有哪些,如何选择?

    比较IDC上市公司,核心在于对比机柜规模、上架率、客户结构和现金流稳定性,而一个专门的比较函数能帮你快速筛选出优质标的,为什么需要系统比较IDC上市公司近年来IDC行业进入存量竞争阶段,上市公司的业务模式差异越来越明显,有的公司重资产扩张,有的则深耕定制化服务,如果只看营收或净利润,容易忽略背后的资产质量和增长……

    2026年8月5日
    800
  • input标签如何操作,input的常用属性有哪些?

    input标签是HTML表单的核心元素,掌握其类型、属性及JavaScript操作是前端开发的基础,本文从实战角度出发,详细解析input标签的常用操作,包括类型选择、表单验证、事件处理和样式定制,帮助你快速提升开发效率,input标签类型对比与选择指南不同类型input对应不同输入场景,选错类型会导致用户体验……

    2026年8月21日
    400
  • 服务器安装什么系统好,linux和windows哪个更适合

    服务器安装系统没有绝对的标准答案,核心原则是“按需分配”:追求极致稳定与低成本选Linux(如CentOS Stream或Rocky Linux),需要图形界面和兼容性选Windows Server,而追求前沿技术栈则考虑Ubuntu LTS,选择服务器操作系统就像为不同性格的员工挑选工位,Linux适合那些喜……

    2026年7月7日
    14900
  • it业务分析_业务测试和分析

    IT业务分析的核心不是画流程图,而是通过业务测试手段持续验证需求假设,让分析结论经得起业务方的追问和系统的检验,把业务测试前置到分析阶段,而不是等开发完再补测试,是2026年IT项目减少返工最实际的做法,IT业务分析怎么做才不流于形式很多团队把业务分析简单理解成“开会访谈+写PRD”,结果文档写了几十页,开发一……

    2026年8月18日
    400

发表回复

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