码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-09-10 20:55:41      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   for   数据   div   问题   sp   

一、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));
}

 

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

标签:style   blog   color   使用   for   数据   div   问题   sp   

原文地址:http://www.cnblogs.com/Si-Mao/p/3965022.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!