当前位置: 首页 > news >正文

C++中的友元 之二

很好,这个问题问得非常到位 👍
友元(friend) 是 C++ 里一个“带争议但非常有工程价值”的设计。

你是 C# 背景,我会从:

  1. 设计哲学差异(C# vs C++)
  2. 语言层面的实现机制
  3. 编译器层面的本质
  4. 为什么必须存在
  5. 工程中的真实使用场景
  6. 它的风险和边界

一步步讲清楚。


一、先从设计哲学讲起

在 C# 里:

  • private 就是绝对私有
  • 只有类自己能访问
  • 你不能“单独授权某个函数”

但在 C++ 里:

封装 ≠ 绝对隔离
封装 = 精细化控制访问权

C++ 允许你说:

“这个函数虽然不属于我,但我信任它。”

这就是 friend 的核心。


二、友元函数是什么?

class A
{
private:int x = 42;friend void PrintA(const A& a);
};
void PrintA(const A& a)
{std::cout << a.x << std::endl; // 合法
}

关键点:

  • PrintA 不是成员函数
  • 但它可以访问 private 成员
  • 它被 A 授权了

三、友元类是什么?

class Engine;class Car
{
private:int speed = 100;friend class Engine;
};class Engine
{
public:void Modify(Car& c){c.speed = 200; // 合法}
};

意思是:

Engine 类里的所有成员,都可以访问 Car 的 private


四、注意:friend 不是“继承”

很多人误解:

  • friend ≠ 子类
  • friend ≠ 成员
  • friend ≠ 双向关系

它只是:

编译期访问授权

而且是单向的:

class A {friend class B;
};

这不代表 A 能访问 B 的 private。


五、编译器层面本质

C++ 的访问控制:

  • 是编译期检查
  • 不是运行期安全机制

编译器做的事情其实是:

检查当前函数是否在:- 当前类成员- 当前类友元

如果是 → 允许访问 private

本质上:

friend 只是扩展了“允许访问 private 的函数集合”

没有任何运行期开销。


六、为什么 C++ 要有 friend?

因为 C++ 追求:

零成本抽象 + 高性能 + 精细控制

有些设计如果没有 friend 会变得非常丑。


七、真实工程场景

1️⃣ 运算符重载(最经典)

你写:

class Complex
{
private:double real;double imag;public:Complex(double r, double i) : real(r), imag(i) {}friend Complex operator+(const Complex& a, const Complex& b);
};

为什么 operator+ 要写成 friend?

因为:

  • 左操作数不一定是成员
  • 运算符是对称的

如果不用 friend:

你只能写成成员函数:

Complex operator+(const Complex& other);

但那样会限制表达式形式。

所以标准库大量使用 friend。

例如:

  • std::ostream& operator<<
  • std::istream& operator>>

2️⃣ 工厂函数

class File
{
private:File() {}public:friend File CreateFile();
};

你可以禁止外部构造,但允许特定函数创建对象。

这是非常高级的控制方式。


3️⃣ 内部耦合类(强关联对象)

比如:

  • 容器类
  • 迭代器类

类似标准库里的:

  • std::vector
  • std::list

它们的 iterator 往往是 friend。

因为:

iterator 需要访问容器内部结构

但不希望对外公开这些细节。


4️⃣ PImpl 技术

在高性能库中常见:

class A
{
private:class Impl;Impl* impl;friend class Impl;
};

内部实现类可以访问外部类。


八、为什么 C# 不需要 friend?

因为:

  • C# 有 internal
  • C# 有 partial
  • C# 有程序集级访问控制

C++ 没有程序集概念。

C++ 的最小封装单位是“类”。

所以 friend 是更精细的访问控制工具。


九、friend 的风险

它会:

  • 打破封装边界
  • 增加耦合
  • 让维护成本上升

所以很多编码规范会说:

少用 friend

但注意:

标准库大量使用 friend。

说明:

friend 不是坏设计
滥用才是坏设计


十、一个更深层的理解

C++ 的核心思想之一:

类不是安全边界
类是抽象边界

friend 的存在说明:

抽象可以跨类

C++ 允许你定义“逻辑上的一个模块”,
哪怕它由多个类组成。


十一、你可以把 friend 理解为:

它让 C++ 支持:

逻辑封装,而不是语法封装


十二、一个高级例子(真正工程级)

假设你写一个高性能锁:

class Mutex
{
private:int state;friend class LockGuard;
};

LockGuard 需要直接操作 state。

但你不希望别人乱动。

friend 正好解决这个问题。


十三、底层哲学

C++ 的设计者(Bjarne Stroustrup)的观点是:

如果程序员知道自己在做什么,就应该给他权力。

friend 就是这种“信任型语言设计”的体现。


十四、总结一句话

friend 是:

对封装进行精细授权的编译期机制

它的本质是:

扩展 private 的访问集合

而不是破坏封装。


十五、给你一个思考题(进阶理解)

为什么下面这个设计在 C++ 里是合理的?

class Matrix;
class MatrixOperator;

MatrixOperator 是 Matrix 的 friend。

这是面向对象吗?
还是面向模块?

如果你理解这个问题,
你就真正理解了 C++。


如果你愿意,我可以下一步讲:

  • friend 和 ADL(参数相关查找)
  • friend 与模板结合时的复杂行为
  • 标准库如何利用 friend 实现“零成本抽象”
  • friend 与 ABI 隐藏
  • 为什么 C++20 仍然保留 friend

你现在已经进入 C++ 的“设计哲学层”了。

http://www.jsqmd.com/news/415483/

相关文章:

  • AI:RAG
  • NCE-Flow 是什么?新概念英语开源学习系统安装与使用教程
  • 远方好物:4年暴涨200万会员,GMV破20亿!它不投广告、不搞流量,凭什么杀出重围?
  • chili3d 是什么?开源在线3D建模工具安装与使用教程
  • 专家安全测试_动态安全服务_移动 APP 漏洞扫描修复工具
  • 对话“五度妙笔”|小核酸药物市场规模与投资前景分析
  • AI Coding
  • 零基础转行网络安全运维?收藏这篇,学习顺序搞错=白费功夫!
  • 记录在vmware虚拟机Ubuntu22.04上编译doom
  • 大数据领域数据中台的实时数据服务接口
  • 丝杆支撑座类型对设备精度的差异化影响
  • AI时代开发者如何转型:AI 求职技能与岗位方向指南
  • 如何每天花10分钟跟上AI重要动态:AI日报信息源推荐指南
  • 如何快速修改图片 DPI?实用方法分享
  • 惠普Deskjet 2132打印机驱动安装与修复,一文搞定所有问题
  • 3D 模型压缩工具 Draco All In One
  • 2026年台北GEO优化公司推荐TOP8:实战效果与技术实力深度测评 - 小白条111
  • CTF夺旗赛完全指南:从零基础到拿分,工具+赛事清单,收藏版直接抄作业!
  • 浅析Superpowers(专为AI编程Agent打造的完整软件开发方法论)强大的软件开发工作流skills
  • 2026年西安GEO优化公司Top7深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年西宁GEO优化公司TOP9推荐:基于本地产业适配的深度测评与选型指南 - 小白条111
  • C++中的友元 之一
  • 2026年西安GEO优化公司推荐Top5:从技术到效果的深度测评与选型指南 - 小白条111
  • 2026年南昌GEO优化公司Top8测评:从技术实力到效果落地的精准选型指南 - 小白条111
  • 2026年西宁GEO优化公司推荐TOP4:深度测评与企业选型指南 - 小白条111
  • 2026年拉萨GEO优化公司TOP8深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年北京靠谱GEO优化服务商深度测评:从技术实力到效果落地的选型指南 - 小白条111
  • 2026年西宁GEO优化公司推荐TOP6:基于AI搜索效果的专业测评与选型指南 - 小白条111
  • 一、选型前必看:台北企业GEO优化的4个核心需求 - 小白条111
  • 2026年南宁GEO优化公司推荐TOP8:从技术实力到效果落地的深度测评榜单 - 小白条111