0

0

c++中如何实现矩阵的加减运算_c++二维数组运算符重载【实例】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-23 15:58:03

|

677人浏览过

|

来源于php中文网

原创

矩阵加减必须封装为类并重载operator+和operator-,使用std::vector一维存储+行列信息,检查维度匹配,返回新对象,三个const缺一不可,索引按i*cols+j计算。

c++中如何实现矩阵的加减运算_c++二维数组运算符重载【实例】

矩阵加减必须重载 operator+operator-

不能靠裸指针或原始二维数组直接运算,C++ 不支持对数组类型自动重载运算符。必须封装成类(如 Matrix),把数据存为 std::vector<:vector>> 或一维 std::vector + 行列信息,再在类内定义成员函数形式的运算符重载。

常见错误是试图对 double a[3][3] 重载 + —— 编译器直接报错:error: cannot overload 'operator+' for type 'double [3][3]'

  • 推荐用一维存储(std::vector data)+ rows/cols 成员,内存连续、缓存友好、避免 vector of vector 的指针跳转开销
  • 运算符应返回新对象(非引用),避免返回局部对象引用或悬垂引用
  • 必须检查维度匹配:加减要求左右操作数 rowscols 完全相等,否则抛 std::invalid_argument

重载函数签名要写成 const 成员 + const 引用参数

典型写法是:Matrix operator+(const Matrix& other) const。三个 const 各有作用:

  • 参数 const Matrix&:避免拷贝,且禁止修改传入矩阵
  • 函数末尾 const:保证不修改当前对象(*this)状态,才能被 const 对象调用
  • 返回值不加 const:允许链式调用(如 a + b + c),C++11 后移动语义也能生效

如果漏掉任意一个 const,可能触发隐式拷贝、编译失败,或导致 const 对象无法参与运算(例如临时对象、const 局部变量)。

立即学习C++免费学习笔记(深入)”;

一维存储下加减运算的索引计算别写错

假设按行优先存储,元素 (i, j) 对应一维下标是 i * cols + j。加减时必须用这个公式遍历,而不是嵌套 [i][j](那是一维 vector 存 vector 才有的语法)。

Hour One
Hour One

AI文字到视频生成

下载

错误示例(误当二维访问):

data[i][j] += other.data[i][j]; // 编译不过:data 是 vector,不支持 [][][]

正确写法(一维索引):

for (size_t i = 0; i < rows; ++i) {
    for (size_t j = 0; j < cols; ++j) {
        size_t idx = i * cols + j;
        result.data[idx] = data[idx] + other.data[idx];
    }
}

  • 循环用 size_t(无符号),避免与 int 混合比较引发警告
  • 不要手写 data[i * cols + j] 多次——提取成变量或用 lambda 封装可读性更好
  • 若矩阵很大,可考虑 OpenMP 并行化外层循环,但小矩阵反而因开销得不偿失

构造函数和拷贝控制要同步更新

一旦用了动态存储(std::vector),默认拷贝构造和赋值已足够安全,无需手动写(遵循 Rule of Zero)。但如果自行管理裸指针(如 double* data),就必须显式定义拷贝构造、拷贝赋值、移动构造、析构函数(Rule of Five),否则加减后对象析构会 double-free。

实际项目中强烈建议:用 std::vector,禁用裸 new/delete;所有资源管理交给标准库

容易被忽略的一点:如果类里加了 operator+= / operator-=,它们应返回 *thisMatrix&),且必须是 non-const 成员函数——否则无法用于 a += b 这种左值场景。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1491

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

86

2025.10.17

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1491

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

86

2025.10.17

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2023.10.25

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号