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
相关产品推荐
相关产品推荐

