当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在另一个构造函数中正确调用默认构造函数》经验,为你挑选了1个好方法。

如果我在另一个构造函数中调用默认构造函数,它会崩溃我的程序.我相信它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::Matrix(){
for(int i=0;i < n_ * m_; i++)
    array_[i] = {};
}

Kerrek SB.. 5

我会像这样构造代码:

template 
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_; }

    // ...
};

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

初始化程序列出初始化类成员,不需要任何分配.

array-new表达式可以使用初始化器()对每个元素进行值初始化; 不需要循环.

默认构造函数委托给通用构造函数.

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



1> Kerrek SB..:

我会像这样构造代码:

template 
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_; }

    // ...
};

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

初始化程序列出初始化类成员,不需要任何分配.

array-new表达式可以使用初始化器()对每个元素进行值初始化; 不需要循环.

默认构造函数委托给通用构造函数.

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

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有