【发布时间】:2010-04-10 21:31:53
【问题描述】:
我知道您不能对数组使用初始化列表。但是,我听说过可以以类似于初始化列表的方式将指针数组设置为 NULL 的方法。
我不确定这是如何完成的。我听说指针默认设置为 NULL,但我不知道这是否在 C++ 标准中得到保证。我也不确定与正常分配相比,通过 new 运算符进行初始化是否也会产生影响。
编辑:我的意思是在头文件/构造函数初始化列表中执行此操作。我不想把它放在构造函数中,也不想使用 Vector。
【问题讨论】:
我知道您不能对数组使用初始化列表。但是,我听说过可以以类似于初始化列表的方式将指针数组设置为 NULL 的方法。
我不确定这是如何完成的。我听说指针默认设置为 NULL,但我不知道这是否在 C++ 标准中得到保证。我也不确定与正常分配相比,通过 new 运算符进行初始化是否也会产生影响。
编辑:我的意思是在头文件/构造函数初始化列表中执行此操作。我不想把它放在构造函数中,也不想使用 Vector。
【问题讨论】:
为了在构造函数初始化器列表中设置一个指向空值的指针数组,您可以使用() 初始化器
struct S {
int *a[100];
S() : a() {
// `a` contains null pointers
}
};
不幸的是,在当前版本的语言中,() 初始化程序是唯一可以与构造函数初始化程序列表中的数组成员一起使用的初始化程序。但显然这就是您的情况所需要的。
() 对使用new[] 分配的数组具有相同的效果
int **a = new int*[100]();
// `a[i]` contains null pointers
在其他情况下,您可以使用 {} 聚合初始化器来实现相同的效果
int *a[100] = {};
// `a` contains null pointers
请注意,绝对没有必要在{} 之间挤压0 或NULL。 {} 的空对就可以了。
【讨论】:
{ }),特别是因为没有理由让对象的默认值必须类似于 0,并且要求初始化对象的代码可能不知道合理的默认值可能是什么(特别是在模板中)。
int *a = new int[100](); 创建了一个指向整数数组的指针,该数组初始化为零,这意味着 a[i] 将包含 0 并且是指向该数组中第 (i+1) 个整数的取消引用指针而不是空指针。
new。 :P
通常默认情况下不会初始化数组,但如果您显式初始化一个或多个元素,则任何剩余元素将自动初始化为 0。由于 0 和 NULL 是等价的,因此您可以初始化一个指针数组NULL 像这样:
float * foo[42] = { NULL }; // init array of pointers to NULL
【讨论】:
NULL 的指针数组。
你可以从数组切换到std::vector并使用
std::vector<T*> v(SIZE);
这些值将由NULLs 自动初始化。这是首选的 C++ 方式。
更新:从 C++11 开始,还有一种方法:使用
std::array<T*, SIZE> array = {};
这更像是 C 样式数组的修正版本(特别是避免动态分配),携带它的大小并且不会衰减到指针。但是,需要在编译时知道大小。
【讨论】:
vectors 应该在编译时不知道大小常量时使用。
std::array,我们可以避免动态分配,同时仍然拥有标准容器的所有其他优点,包括执行边界检查索引的能力(尽管不是自动的,因为您的评论可能会被解读为暗示)使用.at(),如vector
我不确定这是怎么做到的。我听说指针默认设置为 NULL,但我不知道这是否在 C++ 标准中得到保证。
C++ 标准不保证这一点。除非另有设置,否则内置类型(如指针)会被垃圾填充。
我也不确定通过 new 操作符进行初始化与正常分配相比是否也会产生影响。
“正常分配”是什么意思?如果您说的是自动变量,那么您可以这样做:
MyType * pointers[2] = {}
并且指针应该被初始化为NULL。
【讨论】:
{NULL, 0} 和 {}(首选后者),而不是为数组中的所有项目指定一个值。
void* p[10] = { 0 };
【讨论】:
0 这可能是一个问题 - 即,如果您不明确提及0,您将获得0初始化。:S “执行零初始化[...]没有构造函数的值初始化类类型的成员,包括没有为其提供初始化器的聚合元素的值初始化。[...] 零初始化指针是其类型的空指针值,即使值空指针不是整数零。” en.cppreference.com/w/cpp/language/zero_initialization 从 C++11 开始,使用 {}。
如果你有一个成员数组,那么就没有办法初始化,除非它是一个静态成员。如果数组不是静态成员,则必须将其填充到构造函数的主体中。
也就是说,使用std::vector 可能会更好。除了出于技术原因(例如您的平台无法使用标准 STL 或性能稍差)之外,std::vector 在任何和所有标准上都优于阵列。如果性能是问题,那么请确保您进行了分析并通过数字知道这是一个问题。
【讨论】: