我正在尝试学习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*
是一个指针,而指针没有构造函数。如果您有一个类类型为的成员,您可以看到调用了哪个构造函数。
然后,您将看到成员被初始化一次(ctor,而不是赋值(。如果初始化项列表中有可用的初始化项,则使用该初始化项;如果初始化项中没有初始化项,那么使用成员定义中的初始化项。
至于是否应该保留m_data
的默认值,我会说不。主要原因是应该有一个适当的类不变量,我怀疑不变量应该链接m_data
和m_size
。但m_size
在其定义中没有默认值——它可能是S
。但你应该始终如一。