如何在另一个构造函数中正确调用默认构造函数

Alm*_*vić -5 c++ constructor

如果我在另一个构造函数中调用默认构造函数,它会崩溃我的程序.我相信它array_不会在默认构造函数中动态分配.我该如何解决这个问题.

template < typename T >
class Matrix
{
public :
    size_t n_{1};
    size_t m_{1};
    T* array_{nullptr};
 public  :
    Matrix();
    Matrix(size_t n, size_t m) {
        n_ = n;
        m_ = m;
        array_  = new T[n_ * m_];
        Matrix();
    }
}
template < typename T >
Matrix<T>::Matrix(){
for(int i=0;i < n_ * m_; i++)
    array_[i] = {};
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

我会像这样构造代码:

template <typename T>
class Matrix
{
    size_t n_;
    size_t m_;
    T* array_;

public:
    Matrix() : Matrix(1, 1) {}

    Matrix(size_t n, size_t m) : n_(n), m_(m), array_(new T[n_ * m_]()) {}

    ~Matrix() { delete [] array_; }

    // ...
};
Run Code Online (Sandbox Code Playgroud)

这实现了与您的代码预期相同的效果(即默认构造函数生成1×1矩阵,并且所有元素都进行了值初始化),但它使用核心语言功能来简洁地表达:

  • 初始化程序列出初始化类成员,不需要任何分配.
  • array-new表达式可以使用初始化器()对每个元素进行值初始化; 不需要循环.
  • 默认构造函数委托给通用构造函数.

如果您计划使矩阵类可复制,请务必遵守五条规则.如果您只需要一个不可复制(但可移动)类型,则更改array_to 的类型std::unique_ptr<T[]>并删除自定义析构函数.