=运算符是否在C++中调用构造函数/ new?

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已经初始化.

Ðаn*_*Ðаn 5

如果您使用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)

您现在不再需要担心泄漏内存,并且您不需要编写析构函数,复制构造函数或赋值运算符.

  • 相反或调整大小,只是初始化列表中的`data(rows*cols)`. (4认同)