我想在指针的帮助下实现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]
?
答案 0 :(得分:2)
让我们一步一步:
other.elem
指向一些记忆elem = other.elem
,您现在有两个指向同一内存的指针other.elem = nullptr
this->elem
指向该内存这与例如没有什么不同。
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
两者都有独立的资源。