在c ++中移动2d数组的构造函数(语法逻辑不清楚):

时间:2018-01-16 12:15:29

标签: c++ arrays

我想在指针的帮助下实现Matrix类:

class Matrix{
private:
    int row;
    int col;
    double elem**
public:
    //Default Constructor:
    Matrix(int row,int col);
    //Initialized list constructor:
    Matrix(initializer_list<initializer_list<double>> lst);
    //Destructor
    ~Matrix();
    //Copy constructor
    Matrix(const Matrix& other);
    //Copy assingment
    Matrix operator=(const Matrix& other);
    //Move constructor
    Matrix(Matrix&& other);
    //Move assingment
    Matrix operator=(Matrix&& other);

但是我在创建移动构造函数和assingment时遇到问题: 我找到了类似的帖子(How to use move constructor with 2d array (**<type>)?),并根据该帖子创建了我的移动构造函数并移动了分配:

//Move assingment
Matrix operator=(Matrix&& other){
    for(int i = 0;i<row;++i){
        delete[] elem[i];
    }
    delete[] elem;
    elem = other.elem;
    row = other.row;
    col = other.col;
    other.elem = nullptr;
    other.row = 0;
    other.col = 0;
    return *this;

}



//Move constructor
Matrix::Matrix(Matrix&& other):
    row{other.row},
    col{other.col},
    elem{other.row}
    {
        other.elem = nullptr;
        other.row = 0;
        other.col = 0;

    }

但我不理解逻辑。为什么我们可以将指针分配给指针2d数组,如下所示:elem = other.elem;elem{other.row}

我们不应该使用for循环分别为每一行分配元素吗?比如elem[i] = new double[other.col]

2 个答案:

答案 0 :(得分:2)

让我们一步一步:

  1. 移动赋值运算符函数或移动构造函数称为
  2. other.elem指向一些记忆
  3. 使用elem = other.elem,您现在有两个指向同一内存的指针
  4. 只有other.elem = nullptr this->elem指向该内存
  5. 这与例如没有什么不同。

    int a;
    int b;
    
    a = 5;   // Corresponds to the initialization of other.elem
    b = a;   // Corresponds to elem = other.elem
    a = 0;   // Corresponds to other.elem = nullptr
    

答案 1 :(得分:0)

moving意味着偷窃。

只需抓住other所拥有的内容。您将elem指向other的内存,现在您拥有它并使other指向{{1} }}。 null的全部内容是避免复制,因此您不要进行行式复制。当您需要复制构造和复制分配时,明智的复制是有意义的(move)和this两者都有独立的资源。