在定义和构造函数中初始化变量 - 使用
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_data
和 m_size
。但是 m_size
在其定义中没有默认值 - 也许它可能是 S
。但是你应该在那里保持一致。
我正在尝试学习 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_data
和 m_size
。但是 m_size
在其定义中没有默认值 - 也许它可能是 S
。但是你应该在那里保持一致。