在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类型&#39;双&#39;)
9.3218e-306
0
0
0
0
3.81522e-270
nan
nan
如何确保默认初始化所有值,而不仅仅是某些值。此数组可能包含char,double,任何类型,但该类型将始终具有默认构造函数。什么可能导致这个问题?
答案 0 :(得分:1)
据我所知,如果T有默认构造函数,C ++应该在数组中的所有元素上调用它。但是当我输出指向的值时,我得到了一个这样的数组(大小= 8,T类型'双')
你是正确的,如果存在默认构造函数,将使用它。但是像double(和int,float,char等)这样的原始类型 not 有构造函数,默认或其他。尽管该语言允许您在许多情况下使用相同的语法处理基本类型和类类型,但这是一个根本区别。
所以给了一个班级MyClass
然后
MyClass myInstance;
将调用其默认构造函数。
但是给了一个双,那么
double myDouble;
不会以任何方式初始化它。
因此,像在示例中一样创建双精度数组将不会初始化它们。
现在下一个逻辑问题是如何初始化它们。 This stackoverflow question提供了一个答案,并提供了有价值的建议,即使用std::vector
可以帮助避免原始数组经常遇到的一些麻烦。