数组未被默认初始化
Array is not being default initialized
在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
可以帮助避免原始数组经常遇到的一些问题。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 副本初始化的默认模板参数推导
- 使用 std::分配器在 constexpr 中进行默认初始化
- 在C++中使用默认构造函数初始化对象的不同方法
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数时使用垃圾数据初始化对象
- 为什么对象默认初始化,但基元不在C++?
- 默认参数和空列表初始化
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- C++中未初始化成员布尔变量的默认值是多少?
- 两个成员,在Base中默认初始化,可能在Derived中非默认初始化
- 默认初始化无法正常工作
- 如何用默认值0或-1初始化unordered_set
- C++11 默认类成员初始化与初始值设定项列表同时
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在皮条类中初始化默认值的最佳位置
- 值初始化:默认初始化或零初始化