什么是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年福建云数据库价格及对比

    福建云数据库是本地企业实现数据资产化、业务数字化的核心基础设施,它通过提供高可用、低延迟且符合合规要求的存储方案,直接解决了传统服务器维护成本高、数据安全风险大的痛点,在数字化转型的深水区,数据不再仅仅是记录,而是驱动业务增长的核心燃料,对于身处福建的企业而言,选择一款合适的云数据库,意味着选择了更高效的生产力……

    2026年7月6日
    16300
  • 清华ai大语言模型有多强?清华ai大语言模型有哪些应用场景

    清华AI大语言模型并非单一软件,而是指清华大学计算机系及多个实验室联合研发的“清华系”大模型技术集群,其核心优势在于底层算法创新与垂直领域深度结合,目前主要面向高校科研、政企合作及开源社区提供技术支持,普通用户可通过官方开源平台或合作云服务间接体验其能力,在人工智能迅速渗透各行各业的当下,提到“清华AI”,许多……

    2026年6月14日
    2700
  • AI大模型智能终端是什么?2026年AI智能终端发展趋势

    AI大模型智能终端不仅是硬件升级,更是将云端算力转化为本地实时交互能力的入口,其核心价值在于通过端侧大模型实现更低延迟、更高隐私保护且无需联网的智能化体验,什么是AI大模型智能终端及其核心优势端侧算力与云端协同的技术逻辑传统智能手机或PC主要依赖云端处理复杂任务,这意味着网络波动会直接影响体验,且数据需上传至服……

    2026年6月14日
    2100
  • 如何设置服务器自动备份到云盘?服务器自动备份到云盘免费方案

    服务器数据自动备份到云盘是保障业务连续性的最低成本方案,通过配置定时任务将本地数据同步至云端对象存储,可彻底杜绝因硬件故障或人为误操作导致的数据丢失风险,在数字化转型的深水区,数据被视为企业的核心资产,许多中小企业的IT负责人仍停留在“硬盘坏了再换”的传统思维中,本地存储的物理脆弱性极高,雷击、火灾、硬盘坏道甚……

    2026年7月5日
    9100
  • 服务器开通要多久?服务器开通流程及注意事项

    服务器开通并非简单的点击按钮,而是一套涉及资源分配、网络配置与安全策略的严谨工程,选对服务商并规范操作,是保障业务稳定运行的唯一路径,在数字化浪潮席卷全球的2026年,无论是初创团队搭建轻量级应用,还是大型企业部署核心数据库,服务器开通都是业务上线的“第一公里”,许多用户误以为只要注册账号、选择配置即可万事大吉……

    2026年7月10日
    19100
  • 服务器id代码去哪里租?租用服务器id代码怎么选择

    服务器ID代码通常无法直接“租赁”,你需要租赁的是承载该代码运行的云服务器实例(如阿里云ECS、腾讯云CVM),代码本身由开发者编写或从开源社区获取,部署在云主机上即可运行,很多初学者容易混淆“服务器硬件资源”与“运行在上面的业务代码”这两个概念,服务器ID往往指的是云服务商分配给虚拟机的唯一标识符,或者是你部……

    2026年7月3日
    18800
  • vLLM首字延迟TTFT如何优化?vLLM首字延迟TTFT优化方法

    vLLM优化首字延迟(TTFT)的核心在于平衡吞吐量与延迟,通过调整核心参数如max_num_seqs、num_lookahead_slots以及采用连续批处理策略,可显著降低LLM推理的初始等待时间,在大规模语言模型落地生产的场景中,开发者往往面临一个两难选择:既要模型回答得快,又要模型能同时处理大量请求,首……

    AI资讯 2026年6月19日
    2100
  • AI大模型面试怎么准备?大模型面试题高频考点汇总

    2026年AI大模型面试的核心不再是背诵原理,而是展示你驾驭模型解决实际业务痛点的能力,重点考察提示词工程、RAG架构落地及成本控制意识,AI大模型面试趋势与核心能力模型随着生成式人工智能从技术尝鲜期迈入深度应用期,企业对AI人才的需求发生了根本性转移,过去那种只懂Transformer架构或能复现论文代码的候……

    2026年6月15日
    2500
  • 数学AI解题大模型怎么用?2026最新数学AI解题大模型推荐

    数学AI解题大模型能实现秒级精准解析,通过多模态识别与逻辑链推理,将复杂数学问题拆解为可执行步骤,显著提升解题效率与准确率,是2026年教育科技领域的核心工具,数学ai解题大模型的核心能力解析过去的数学辅导依赖人工批改或简单的公式搜索,而现在的数学ai解题大模型已经进化为具备深度理解能力的智能助手,它不再仅仅是……

    2026年6月15日
    4200
  • 大模型迁移学习是什么?大模型迁移学习有哪些应用场景

    大模型迁移学习的核心在于利用预训练模型的通用知识,通过少量标注数据微调特定任务,从而以极低的成本实现高精度垂直领域落地,这是当前企业智能化转型的最优解,想象一下,你请了一位博古通今的博士(基础大模型),但他不懂你们公司的内部流程,你不需要重新培养一个新博士,只需要给他看几份公司文件,让他熟悉业务语境,他就能立刻……

    2026年6月21日
    2500

发表回复

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