Menu
CoddyTech

复习:矩阵类

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 47 课,共 104 课。

challenge icon

挑战

简单

让我们来创建一个 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 矩阵。输入格式如下:
    1. 第一个矩阵的四个整数(按行排列):a00、a01、a10、a11
    2. 第二个矩阵的四个整数(按行排列):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++ 在线编译器