我需要制作一个动态阵列。我有这个构造函数原型。 ExArray(int);
indivdual elements must be default constructed
{{1}}。当它希望元素是默认构造时意味着什么?它是否希望在默认构造函数中初始化元素而不是在此构造函数中?
答案 0 :(得分:1)
据推测,类构造函数用于ExArray
类。但这是一个容器类,它包含其他对象(例如类似于std::vector
)。例如,为了拥有大小为10的ExArray
,其中包含类X
的实例,合理的要求是使X
具有默认构造函数。这样,容器中的10个项目中的每一个都将是默认构造的。否则,很难定义ExArray
,因为必须为它包含的类提供构造函数参数。
答案 1 :(得分:0)
在像std::array<T,n> arr
或C风格T arr[n]
的静态数组中,当构造数组时,C ++会自动调用数组中每个元素的默认构造函数(T::T()
)。删除数组时,它会调用每个元素的析构函数。
像std::vector
这样的动态数组(其中可以追加/删除元素)需要在添加元素时手动处理。例如:
T* elements = static_cast<T*>( std::malloc(n * sizeof(T)) );
for(std::ptrdiff_t i = 0; i < n; ++i)
new (&elements[i]) T();
为n
元素分配原始内存,并将指针强制转换为指向未初始化T
元素的指针。然后它手动调用每个元素的默认构造函数。
使用placement new初始化对象/调用构造函数。可以像elements[i].~T()
一样调用析构函数。