MST

星途 面试题库

面试题:C++ 流运算符重载处理复杂对象结构

有一个 `Matrix` 类表示二维矩阵,包含一个动态分配的二维数组作为成员变量来存储矩阵元素。请重载 `>>` 和 `<<` 运算符,使得可以从输入流读取矩阵数据(格式为先行数再列数,然后是矩阵元素按行输入),并能以矩阵的形式输出到输出流。例如输入格式为 `3 3 1 2 3 4 5 6 7 8 9`,输出格式为: ``` 1 2 3 4 5 6 7 8 9 ```
31.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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

class Matrix {
private:
    int** data;
    int rows;
    int cols;

public:
    Matrix(int r = 0, int c = 0) : rows(r), cols(c) {
        if (rows > 0 && cols > 0) {
            data = new int* [rows];
            for (int i = 0; i < rows; ++i) {
                data[i] = new int[cols];
            }
        } else {
            data = nullptr;
        }
    }

    ~Matrix() {
        if (data != nullptr) {
            for (int i = 0; i < rows; ++i) {
                delete[] data[i];
            }
            delete[] data;
        }
    }

    // 重载>>运算符
    friend std::istream& operator>>(std::istream& is, Matrix& matrix) {
        is >> matrix.rows >> matrix.cols;
        if (matrix.data != nullptr) {
            for (int i = 0; i < matrix.rows; ++i) {
                delete[] matrix.data[i];
            }
            delete[] matrix.data;
        }
        matrix.data = new int* [matrix.rows];
        for (int i = 0; i < matrix.rows; ++i) {
            matrix.data[i] = new int[matrix.cols];
            for (int j = 0; j < matrix.cols; ++j) {
                is >> matrix.data[i][j];
            }
        }
        return is;
    }

    // 重载<<运算符
    friend std::ostream& operator<<(std::ostream& os, const Matrix& matrix) {
        for (int i = 0; i < matrix.rows; ++i) {
            for (int j = 0; j < matrix.cols; ++j) {
                os << std::setw(4) << matrix.data[i][j];
            }
            os << std::endl;
        }
        return os;
    }
};

你可以这样测试这个类:

int main() {
    Matrix m;
    std::cout << "请输入矩阵(格式为先行数再列数,然后是矩阵元素按行输入): ";
    std::cin >> m;
    std::cout << "输出矩阵: \n" << m;
    return 0;
}