通常情况下,如果我有string array[10]
,我可以初始化数组中的所有点,如:
for(int i = 0; i < 10; i++)
array[i] = "";
或者如果它是一个带指针的数组,我改为编写array[i] = nullptr
,但是如果类型更像T array[10]
这样的类型,我该如何进行初始化?
答案 0 :(得分:8)
如果只需要值初始化,则可以使用空括号对所有数组成员进行值初始化:
T array[10]{};
// ^^
或者:
T array[10] = {};
值初始化为标量生成零值或空值,为聚合值初始化每个成员,并为非聚合类类型调用默认构造函数。
(如果要使用T{}
以外的值初始化数组元素,则需要更复杂和特定的内容。)
答案 1 :(得分:4)
你可以像标准那样做,并以
的形式使用初始化函数template<typename T, std::size_t N>
void initialize(T (&arr)[N], const T& value = T())
{
for(auto& e : arr)
e = value;
}
现在你可以调用它而不传递一个值,并且数组用默认值初始化,或者你可以指定一个值,数组将用该值初始化。
答案 2 :(得分:3)
如果您的目标是在数组的所有元素上调用默认构造函数,则可以使用值初始化:
#include <iostream>
#include <string>
#include <cassert>
template <typename T>
struct A {
// value-initialize `array` which value-initializes all elements of `array`.
A() : array() {}
T array[10];
};
int main() {
A<int> ints;
for(auto e: ints.array) {
assert(e == 0);
}
A<std::string> strings;
for(auto e: strings.array) {
assert(e.empty());
}
A<int*> int_ptrs;
for(auto e: int_ptrs.array) {
assert(e == nullptr);
}
// etc.
}