在定义和构造函数中初始化变量 - 使用

Initializing variables in definition and constructor - which is used

我正在尝试学习 C++ 和编程,因此我正在 STL 中实现一些数据结构。

至于我的 vector 版本,我有两个构造函数,其中一个允许您指定内存中的存储位置,如果您愿意的话。如果不是,我已将内部数据的地址设置为 nullptr。

我想知道这将如何运作。使用第一个构造函数,我假设 m_data 将设置为 nullptr,但在第二种情况下会发生什么? m_data是不是先设置为nullptr,然后在构造中覆盖?是否有理由在定义中将定义保留为 nullptr,或者我应该在两种情况下都使用初始化列表?

代码如下:

template <typename T, size_t S = 0>
class custom::vector {
private:
    T* m_data = nullptr;
    size_t m_size;
    size_t m_capacity;

    T* m_future_data = nullptr;
    size_t m_future_cap;
public:
    // Constructors
    vector() : m_size(S), m_capacity(S) {}
    vector(T* destination, const size_t& capacity) : m_size(S) {
        m_data = destination;
        m_capacity = capacity;
    }
// .... rest of class

这很棘手,所以要看你的具体情况,因为 T* 是一个指针,而指针没有构造函数。如果你有一个 class 类型的成员,你可以看到调用了哪个构造函数。

然后您将看到成员被初始化(ctor,而不是赋值)一次。使用的初始化器将是初始化器列表中的那个,如果有一个可用的话,或者如果初始化器列表中没有初始化器,则来自成员定义。

至于是否应该保留 m_data 的默认值的问题,我会说不。这样做的主要原因是你应该有一个适当的 class 不变量,我怀疑不变量应该 link m_datam_size。但是 m_size 在其定义中没有默认值 - 也许它可能是 S。但是你应该在那里保持一致。