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

C++中的友元 之三

很好,这个问题问得非常扎实 👍
说明你没有“假装懂”,而是在认真消化。

先直接回答你:

class Matrix; class MatrixOperator;
不是 C++ 标准库里的东西。

它们只是我举的一个抽象例子,用来说明一种设计模式。

你没见过是完全正常的。


一、那两行代码到底是什么?

class Matrix;
class MatrixOperator;

这叫:

前向声明(forward declaration)

意思是:

“这个类型存在,但我现在先不展开定义。”

比如:

class Matrix;  // 只声明class MatrixOperator
{
public:static Matrix Add(const Matrix& a, const Matrix& b);
};

然后在后面真正定义 Matrix:

class Matrix
{
private:double* data;int rows;int cols;friend class MatrixOperator;
};

二、为什么要这么设计?

现在进入关键思想。

在 C# 里你习惯这样:

class Matrix
{public Matrix Add(Matrix other) { ... }
}

所有逻辑都写在类里。

这是:

面向对象中心化设计

但在 C++ 里,还有另一种思路:

面向“模块”设计,而不是“类中心设计”


三、为什么不用成员函数?

假设你写矩阵运算:

Matrix C = A + B;
Matrix D = A * B;
Matrix E = Inverse(A);

如果全部写成成员函数:

A.Add(B);
A.Multiply(B);
A.Inverse();

问题来了:

  • 运算是对称的
  • 有些算法不是“某个对象的方法”
  • 有些函数需要访问内部结构
  • 但不属于类本身

比如:

  • LU 分解
  • SVD
  • 快速乘法算法
  • SIMD 优化版本

这些更像:

算法模块

而不是“Matrix 的行为”。


四、friend 在这里的意义

假设你把所有算法都放在 Matrix 里:

class Matrix {// 5000 行算法代码
};

会发生什么?

  • 类巨大
  • 编译时间爆炸
  • 依赖关系混乱
  • 接口污染

另一种设计:

class Matrix
{
private:double* data;int rows;int cols;friend class MatrixOperator;
};
class MatrixOperator
{
public:static Matrix Add(const Matrix&, const Matrix&);static Matrix Multiply(const Matrix&, const Matrix&);static Matrix Inverse(const Matrix&);
};

这样:

  • Matrix 只负责“数据结构”
  • MatrixOperator 负责“算法”

这是一种:

数据结构 与 算法分离

这在 C++ 里非常常见。


五、这算面向对象吗?

这是你刚才那个“思考题”的核心。

在 C# 世界里:

类 = 封装单位

在 C++ 世界里:

模块 = 封装单位

多个类可以组成一个逻辑模块。

friend 就是实现这种“模块级封装”的工具。


六、真实世界例子(标准库)

你还没学运算符重载,
但我给你一个标准库例子。

比如:

std::cout << 10;

这里的 operator<< 不是 std::ostream 的成员函数。

它是:

非成员函数

但它可以访问内部。

标准库大量使用这种设计。

因为:

  • 运算符是对称语义
  • 不应该只属于左操作数
  • 需要访问内部结构

七、你现在会困惑是正常的

因为你现在处于:

C# 思维 → C++ 思维 转换阶段

C# 更强调:

  • 对象
  • 继承
  • 成员函数

C++ 更强调:

  • 值语义
  • 算法与数据分离
  • 零成本抽象

friend 是这种思想的产物。


八、我给你一个更贴近你背景的例子

你做高性能采集系统。

假设你写:

class FrameBuffer
{
private:float* data;size_t size;friend class FrameProcessor;
};

为什么不用 public?

因为:

  • 不希望别人乱改
  • 但处理算法需要直接操作内存
  • 不想每次调用 getter(可能影响优化)

你就可以:

  • 对外保持封装
  • 对内保持性能

这就是 friend 的工程意义。


九、现在你真正应该理解的重点

那两行代码不是重点。

重点是:

C++ 允许你把“类”当成一个构建块,
但不要求“所有逻辑都必须写在类里”。

这和 C# 非常不同。


十、一个关键对比

C# 思维 C++ 思维
类是中心 模块是中心
行为必须是成员 行为可以是非成员
private 几乎绝对 private 可精细授权
面向对象 面向抽象 + 性能

十一、你现在应该怎么学?

既然你还没学运算符重载,

我建议顺序:

  1. 运算符重载
  2. 非成员函数
  3. ADL(参数相关查找)
  4. 模板
  5. 迭代器模式

到那时你会突然明白:

friend 是为“泛型 + 性能”服务的


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

相关文章:

  • C++中的友元 之二
  • 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