You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++通过重载构造函数实现编译/运行时2D数组大小设置及用户输入

原代码问题说明

  • C++ 内置数组动态分配时不支持new int[n][n]写法,该语法要求第二维长度必须是编译期常量,因此会触发n需为常量的报错
  • 类内成员初始化使用auto无法正确推导二维数组指针类型,语法不支持
  • 构造函数中arr[n][n] = {0,0}属于越界访问,长度为n的数组下标范围是0~n-1,该写法会操作非法内存

实现方案

1. 运行期动态确定大小(支持用户输入指定尺寸,优先推荐)

使用STL的std::vector实现,无需手动管理内存,避免泄漏和越界风险:

#include <vector>

class Matrix {
private:
    std::vector<std::vector<int>> arr;
public:
    // 传入n直接初始化n行n列的二维数组,所有元素默认初始化为0
    Matrix(int n) : arr(n, std::vector<int>(n, 0)) {}

    // 示例:获取数组元素的接口
    int get(int row, int col) const {
        return arr.at(row).at(col); // at方法自带越界检查
    }

    // 示例:设置数组元素的接口
    void set(int row, int col, int val) {
        arr.at(row).at(col) = val;
    }
};

// 使用示例:用户输入n后创建对象即可
// int n; std::cin >> n; Matrix m(n);

如果必须使用原生指针手动分配,写法如下:

class Matrix {
private:
    int** arr = nullptr;
    int size;
public:
    Matrix(int n) : size(n) {
        // 第一步:分配存储n个行指针的数组
        arr = new int*[n];
        // 第二步:为每一行分配n个int的存储空间,值初始化全为0
        for (int i = 0; i < n; ++i) {
            arr[i] = new int[n]();
        }
    }

    // 析构函数释放内存,避免泄漏
    ~Matrix() {
        for (int i = 0; i < size; ++i) {
            delete[] arr[i];
        }
        delete[] arr;
    }

    // 禁用拷贝构造和拷贝赋值,避免浅拷贝导致的双重释放问题
    Matrix(const Matrix&) = delete;
    Matrix& operator=(const Matrix&) = delete;
};

2. 编译期确定大小(尺寸固定无需运行期输入时使用)

使用模板非类型参数实现:

template <int N> // N为编译期常量,创建对象时指定
class Matrix {
private:
    int arr[N][N] = {0}; // 直接声明固定大小二维数组,全0初始化
public:
    Matrix() = default;
};

// 使用示例:编译期就确定数组大小为5*5
// Matrix<5> m;

内容的提问来源于stack exchange,提问作者Dominic Casamatta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:04