MST

星途 面试题库

面试题:C++运算符重载三种方式之普通函数重载运算符及运算符优先级问题

定义一个矩阵类Matrix,该类用二维数组存储矩阵元素,有行数和列数两个成员变量。请使用普通函数的方式重载C++中的乘法运算符(*),实现两个矩阵相乘(需检查矩阵维度是否匹配),返回一个新的Matrix对象。另外,讨论在存在多个重载运算符的情况下,如何保证乘法运算符的优先级正确,并给出代码示例说明如何避免优先级带来的潜在错误。
34.2万 热度难度
编程语言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& operator()(int i, int j) {
        return data[i][j];
    }

    const int& operator()(int i, int j) const {
        return data[i][j];
    }
};

Matrix operator*(const Matrix& a, const Matrix& b) {
    if (a.getCols() != b.getRows()) {
        throw std::invalid_argument("矩阵维度不匹配");
    }

    Matrix result(a.getRows(), b.getCols());

    for (int i = 0; i < a.getRows(); ++i) {
        for (int j = 0; j < b.getCols(); ++j) {
            for (int k = 0; k < a.getCols(); ++k) {
                result(i, j) += a(i, k) * b(k, j);
            }
        }
    }

    return result;
}

// 讨论优先级及避免潜在错误
// 在C++中,乘法运算符优先级高于加法运算符等。
// 为避免优先级错误,在复杂表达式中使用括号明确运算顺序。
// 示例:
void priorityExample() {
    Matrix a(2, 2);
    Matrix b(2, 2);
    Matrix c(2, 2);

    a(0, 0) = 1; a(0, 1) = 2;
    a(1, 0) = 3; a(1, 1) = 4;

    b(0, 0) = 5; b(0, 1) = 6;
    b(1, 0) = 7; b(1, 1) = 8;

    c(0, 0) = 9; c(0, 1) = 10;
    c(1, 0) = 11; c(1, 1) = 12;

    // 明确括号,避免优先级错误
    Matrix result1 = (a * b) + c; 
    // 如果写成 Matrix result2 = a * b + c; 则可能因优先级问题得到错误结果
}
  1. 矩阵乘法实现
    • 重载乘法运算符operator*,首先检查两个矩阵的维度是否匹配,如果不匹配抛出std::invalid_argument异常。
    • 然后创建一个新的Matrix对象作为结果矩阵,通过三重循环实现矩阵乘法的核心逻辑。
  2. 优先级讨论及代码示例
    • 在C++中,乘法运算符*的优先级高于加法运算符+等。
    • 在复杂表达式中,为了避免因优先级导致的潜在错误,使用括号明确运算顺序,如代码示例priorityExample函数中(a * b) + c明确了先进行矩阵乘法再进行加法。