复习:矩阵类
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 47 课,共 104 课。
挑战
简单让我们来创建一个 Matrix 类,把你在本章学过的所有运算符重载技巧结合起来。你将创建一个功能完善的矩阵,支持算术运算、比较、元素访问和流输出,所有操作都通过直观的运算符语法完成。
你将把代码分成两个文件:
Matrix.h:定义一个Matrix类,使用动态内存管理二维整数数组。你的矩阵应支持:- 私有成员:用于存储二维数据的
int**指针,以及表示行数和列数的size_t成员 - 一个接收行数和列数的构造函数,并将所有元素初始化为 0
- 一个能正确释放所有已分配内存的析构函数
- 一个复制构造函数和复制赋值运算符(深拷贝,并检查自赋值)
- 获取行数和列数的 getter:
getRows()和getCols()(两者都是 const) - 一个用于设置单个元素的
set(row, col, value)方法 - 一个用于获取元素的 const 方法
get(row, col)
实现以下运算符:
- 算术:用
+和-对矩阵进行加法和减法运算(按值返回新的 Matrix) - 比较:用
==和!=检查两个矩阵的维度是否相同,以及元素是否完全相同 - 流:将
<<实现为友元函数,逐行输出矩阵,各元素之间用空格分隔,每行另起一行 - 下标:实现
[],使其返回指向某一行的指针,从而支持matrix[row][col]语法(提供 const 和非 const 两个版本)
对于算术运算符,假设两个矩阵的维度相同。如果维度不同,比较运算符应返回
false。- 私有成员:用于存储二维数据的
main.cpp:读取输入,创建并操作两个 2x2 矩阵。输入格式如下:- 第一个矩阵的四个整数(按行排列):a00、a01、a10、a11
- 第二个矩阵的四个整数(按行排列):b00、b01、b10、b11
创建两个
Matrix对象(每个对象有 2 行、2 列),使用set()方法填入元素,然后演示这些运算符:输出格式:
Matrix A: <row0> <row1> Matrix B: <row0> <row1> A + B: <row0> <row1> A - B: <row0> <row1> A == B: <true/false> A != B: <true/false> A[0][0]: <value> A[1][1]: <value>每行的元素之间应以单个空格分隔。比较结果请输出小写的
true或false。
例如,矩阵 A 的输入为 1 2 3 4,Matrix B: 的输入为 5 6 7 8 时:
Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4使用 std::stoi() 转换输入。请记得用 == 实现 !=,以确保运算符行为一致。别忘了在头文件中添加头文件保护。
亲手试试
#include <iostream>
#include <string>
#include "Matrix.h"
using namespace std;
int main() {
// 读取第一个矩阵(2x2)的输入:a00、a01、a10、a11
int a00, a01, a10, a11;
cin >> a00 >> a01 >> a10 >> a11;
// 读取第二个矩阵(2x2)的输入:b00、b01、b10、b11
int b00, b01, b10, b11;
cin >> b00 >> b01 >> b10 >> b11;
// TODO: 创建两个 Matrix 对象(每个对象有 2 行、2 列)
// TODO: 使用 set() 方法填充矩阵
// TODO: 输出矩阵 A
// cout << "Matrix A:" << endl;
// 使用 << 运算符打印矩阵
// TODO: 输出矩阵 B
// cout << "Matrix B:" << endl;
// 使用 << 运算符打印矩阵
// TODO: 输出 A + B
// cout << "A + B:" << endl;
// TODO: 输出 A - B
// cout << "A - B:" << endl;
// TODO: 输出比较结果
// cout << "A == B: " << (用三元运算符判断 true/false) << endl;
// cout << "A != B: " << (用三元运算符判断 true/false) << endl;
// TODO: 输出下标访问结果
// cout << "A[0][0]: " << ... << endl;
// cout << "A[1][1]: " << ... << endl;
return 0;
}
面向对象编程中的所有课
自己练习: C++ 在线编译器