C++动态申请二维数组与拷贝构造函数

一、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

C++动态申请二维数组与拷贝构造函数的相关文章

动态申请 二维数组 以及初始化、 赋值

二维堆数组 可以利用指针的指针 例如 int ** array = new int[i][j]; 但是这样不能通过编译,因为堆数组不像基于栈数组那样工作,为其分配的内存是不连续的,因此堆数组分配足够的内存是不对的,应当先分配基于堆数组第一维数组下标分配一个连续的数组.该数组的每一个元素实际上是指向一个数组的指针. 一个测试小例: #include <iostream> #include <stdio.h> #include <cstring> using namespa

动态申请二维数组

int main() {int **p;int m,n; cout << "请输入行数和列数:" << endl;cin >> m >> n; p = new int *[m]; for(int i = 0;i <= m-1;i++){    p[i]=new int[n];} for(int row = 0;row <= m-1;row++){    for(int col = 0; col <= n-1;col++)

C++中动态申请二维数组

这里主要介绍C++中动态申请二维数组的两种方式,直接给出代码,很容易明白,简单的作为一个笔记. #include <iostream> #include <iomanip> // 输入输出操纵 #include <vector> using namespace std; // 法一:new 方式申请 void dynamicArray() { int rows, cols; cin >> rows >> cols; int **element =

C++中动态申请二维数组并释放方法

C/C++中动态开辟一维.二维数组是非常常用的,以前没记住,做题时怎么也想不起来,现在好好整理一下. C++中有三种方法来动态申请多维数组 (1)C中的malloc/free (2)C++中的new/delete (3)STL容器中的vector 下面逐一介绍: 第一种:malloc/free 1.动态开辟一维数组 [cpp] view plaincopy //动态开辟一维数组 void dynamicCreate1Array() { int m; int i; int *p; printf("

c++和c动态申请二维数组

这是我面试中遇到的一道题,用c和c++分别申请一个二维数组,int **res,要求申请后的可以使用res[3][4]这一类防存方式. 这个是没有错误检查的版本. 答案: c++语言的版本 int **allocate(int row, int column) { int **res = new int*[row]; for (int i = 0; i < row; i++) { res[i] = new int[column]; } return res; } c语言 int **alloca

C语言 动态创建二维数组

/*C语言 如何动态创建二维数组 转化为一维数组申请数组,创建和释放都比较简单 */ #include <stdlib.h> #include <stdio.h> #include <malloc.h> #define RANK 10 #define COLUMN 7 int main() { int i,j; int (*p)[COLUMN]; //动态生成二维数组,指定列数为COLUMN,如果想改,自己该里面 //的参数,如果想定义n行2列就为: p=(int (*

一句话动态开辟二维数组

#include<iostream> using namespace std; //动态开辟int p[4][5]数组 void main() { //为了验证正确性,我们先把开辟的一维数组赋值给 pp int *pp=new int[20]; int i=0,j=0; for(i=0;i<20;i++)//为一维数组中每一个元素赋值,并输出该元素地址 { pp[i]=i; cout<<&(pp[i])<<" ";//即 pp+i }

动态创建二维数组

vector创建二维数组 初始化二维数组 vector<vector <int> > ivec(n ,vector<int>(m)); //n*m的二维vector vector<vector <int> > ivec(n , vector<int>(m, 0)); //n*m的二维vector,所有元素为0 动态创建m*n的二维 方法一: vector<vector <int> > ivec; ivec.re

【C语言】动态创建二维数组

//动态创建二维数组 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { int i,j; int n,m; //以n行5列为例 int (*p)[5]; printf("请输入行数:"); scanf("%d",&n); p=(int(*)[5])malloc(5*n*sizeof(int)); for(i=0;i<n;i+