McA*_*gus 0 c++ arrays oop assignment-operator assign
假设我有一个(不可变的)矩阵类,它在构造函数中动态创建一个数组,并在解构器中删除它.
template <typename T>
class matrix {
private:
T* data;
public:
size_t const rows, cols;
matrix(size_t rows, size_t cols) : rows(rows), cols(cols) {
data = new T[rows*cols];
}
~matrix() {
delete [] data;
}
//access data
T& operator()(size_t row, size_t col) {
return data[row*cols + col];
}
matrix<T>& operator=(const matrix<T>& other) {
//what will this->data contain? do I need to delete anything here?
//should I call the constructor?
rows = other.rows;
cols = other.cols;
data = new T[rows*cols];
std::copy(&data[0],&data[0] + (sizeof(T)*rows*cols),&other.data[0]);
return *this;
}
}
Run Code Online (Sandbox Code Playgroud)
因为我在operator=函数中没有默认构造函数,所以数据this只是垃圾,对吧?即使我有一个默认的构造函数,它会被调用吗?我在这里以上的代码为基础.请注意,为简洁起见,我省略了输入验证/边界检查.
编辑:我想澄清一点,我只关心这样的电话:
matrix<int> A = B;
Run Code Online (Sandbox Code Playgroud)
B已经初始化.
如果您使用std::vector存储数据,您的课程将变得更加简单
template <typename T>
class matrix {
std::vector<T> data;
public:
size_t const rows, cols;
matrix(size_t rows, size_t cols) : rows(rows), cols(cols) {
data.resize(rows*cols);
}
//access data
T& operator()(size_t row, size_t col) {
return data[row*cols + col];
}
}
Run Code Online (Sandbox Code Playgroud)
您现在不再需要担心泄漏内存,并且您不需要编写析构函数,复制构造函数或赋值运算符.