数组未被默认初始化

Array is not being default initialized

本文关键字:初始化 默认 数组      更新时间:2023-10-16

在Foo类中,我有一个Bar类型的成员变量。Bar是在我的Foo构造函数中通过传递一个指向数组的指针来构建的,如下所示:

template<typename> T
class Foo{
Bar myBar;
size_t mySize;
size_t top;
Foo(size):myBar(new T[size]),mySize(size),top(0){}; //creates a Bar element of certain size
}
template<typename> T
class Bar{
T* myListPtr;
Bar::Bar(T* tPtr):myListPtr(tPtr){}  //stores a pointer to a T array
}

据我所知,如果T有一个默认构造函数,C++应该在数组中的所有元素上调用它。然而,当我输出所指向的值时,我得到了这样的数组(大小=8,T类型为"double")

9.3218e-306
0
0
0
0
3.81522e-270
nan
nan

如何确保所有值都默认初始化,而不仅仅是一些值。此数组可能包含char、double或任何类型,但该类型始终具有默认构造函数。是什么原因导致了这个问题?

据我所知,如果T有一个默认构造函数,C++应该在数组中的所有元素上调用它。然而,当我输出所指向的值时,我得到了这样的数组(大小=8,T类型为"")

你是正确的,如果默认构造函数存在,就会使用它。然而,像double(以及int、float、char等)这样的基元类型不具有构造函数(默认值或其他值)。尽管在许多情况下,该语言允许您使用语法相同的基元类型和类类型,但这是一个根本区别。

所以给定一个类MyClass然后

MyClass myInstance;

将调用其默认构造函数。

但如果是双倍,那么

double myDouble;

不会以任何方式初始化它。

因此,像您在示例中所做的那样创建一个double数组将不会初始化它们。

现在,下一个合乎逻辑的问题是如何初始化它们。这个stackoverflow问题提供了一个答案,也提供了一些有价值的建议,即使用std::vector可以帮助避免原始数组经常遇到的一些问题。