一、C++动态申请二维数组
在C++中不能直接动态申请二维数组,经过一番搜索,发现一种动态申请二维数组较好的方法。
代码如下(MATRIX_TYPE为某一种类型,Lines和Columns):
MATRIX_TYPE** elem; //C++二维矩阵动态申请空间 elem = new MATRIX_TYPE*[Lines]; elem[0] = new MATRIX_TYPE[Lines * Columns]; for(int i = 1; i < Lines; i++) elem[i] = elem[i - 1] + Columns;
可以直接读取和赋值:
elem[i][j] = 0;
这种方法申请二维数组的优点是内存连续,使用直接。
二、C++拷贝构造函数
当使用如下代码时,C++会将原对象进行拷贝,再赋值给下一个对象。但是这会出现一个问题,就是当对象中包含动态成员时,C++无法将动态成员数据进行拷贝。
class Matrix { public: int Lines; int Columns; MATRIX_TYPE** elem; //初始化 Matrix(); Matrix(int lines, int columns); ~Matrix(); }; Matrix::Matrix(int lines, int columns) { Lines = lines; Columns = columns; //C++二维矩阵动态申请空间 elem = new MATRIX_TYPE*[Lines]; elem[0] = new MATRIX_TYPE[Lines * Columns]; for(int i = 1; i < Lines; i++) elem[i] = elem[i - 1] + Columns; memset(elem[0], 0, Lines * Columns * sizeof(MATRIX_TYPE)); } Matrix::~Matrix() { //C++二维矩阵析构 delete elem[0]; delete elem; }
Matrix m2 = Matrix(); Matrix m1 = m2;
解决这一问题的一个办法是重写拷贝构造函数。形式如下:
//拷贝构造函数 Matrix::Matrix(const Matrix& m) { //由于在构造函数中存在new,故必须重写拷贝构造函数 Lines = m.Lines; Columns = m.Columns; //C++二维矩阵动态申请空间 elem = new MATRIX_TYPE*[Lines]; elem[0] = new MATRIX_TYPE[Lines * Columns]; for(int i = 1; i < Lines; i++) elem[i] = elem[i - 1] + Columns; memcpy(elem[0], m.elem[0], Lines * Columns * sizeof(MATRIX_TYPE)); }
时间: 2024-12-19 11:43:03