【问题标题】:Initializing variables in definition and constructor - which is used在定义和构造函数中初始化变量 - 使用
【发布时间】:2020-09-15 08:54:58
【问题描述】:

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

至于我的向量版本,我有两个构造函数,其中一个允许您指定内存中的存储位置,如果您愿意的话。如果不是,我将内部数据的地址设置为 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

【问题讨论】:

    标签: c++ data-structures constructor initializer-list


    【解决方案1】:

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

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

    至于你是否应该保留m_data 的默认值,我会说不。主要原因是你应该有一个适当的类不变量,我怀疑不变量应该链接m_datam_size。但是m_size 在其定义中没有默认值——它可能是S。但是你应该在那里保持一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-27
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多