MST

星途 面试题库

面试题:C++二元运算符重载的复杂实现及注意事项

假设有一个自定义的矩阵类Matrix,包含二维数组作为数据成员来存储矩阵元素。请重载乘法运算符(*)实现矩阵乘法。同时说明在实现过程中可能遇到的错误以及如何避免,比如矩阵维度不匹配等问题。
48.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>

class Matrix {
private:
    std::vector<std::vector<int>> data;
    int rows;
    int cols;

public:
    Matrix(int r, int c) : rows(r), cols(c), data(r, std::vector<int>(c, 0)) {}

    // 获取矩阵的行数
    int getRows() const {
        return rows;
    }

    // 获取矩阵的列数
    int getCols() const {
        return cols;
    }

    // 获取矩阵的元素
    int getElement(int i, int j) const {
        return data[i][j];
    }

    // 设置矩阵的元素
    void setElement(int i, int j, int value) {
        data[i][j] = value;
    }

    // 重载乘法运算符
    Matrix operator*(const Matrix& other) const {
        if (cols != other.rows) {
            throw std::invalid_argument("矩阵维度不匹配,无法相乘");
        }

        Matrix result(rows, other.cols);

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

        return result;
    }
};

可能遇到的错误及避免方法:

  1. 矩阵维度不匹配
    • 错误描述:当左矩阵的列数与右矩阵的行数不相等时,矩阵乘法无法进行。
    • 避免方法:在重载的operator*函数中,首先检查左矩阵的列数(cols)是否等于右矩阵的行数(other.rows)。如果不相等,抛出std::invalid_argument异常提示维度不匹配。
  2. 内存分配失败
    • 错误描述:在创建结果矩阵result时,如果内存分配失败(例如系统内存不足),会导致程序崩溃。
    • 避免方法:使用try - catch块捕获std::bad_alloc异常,在异常处理中进行适当的错误处理,比如输出错误信息并终止程序。不过,在C++11及之后的标准库中,std::vector在内存分配失败时会抛出std::bad_alloc异常,这里简单的Matrix类使用std::vector存储数据,所以一般情况下系统会自动处理这种异常。
  3. 数据类型溢出
    • 错误描述:如果矩阵元素的数据类型是有范围限制的(如int),在计算矩阵乘法的过程中可能会发生数据溢出,导致结果错误。
    • 避免方法:根据实际情况选择合适的数据类型,例如如果元素值可能很大,可以使用long long或者自定义高精度数据类型。另外,可以在乘法运算前进行范围检查,以避免溢出情况发生。