使用类成员初始化数组时的奇怪行为

Odd behavior when initializing an array using a class member

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

我发现了一个奇怪的初始化,我试图绕开我的头。我知道数组可以使用 T[size] {} 初始化为所有默认值,这似乎在大多数情况下有效,但在由类成员初始化时似乎不起作用,如下所示:

class Hashtable {
    int *table;
    int size;
public:
    Hashtable() : size { 10 }, table { new int[size]{} } {
        for (int index = 0; index != size; ++index) { // size = 10
            cout << table[index] << endl; // this displays an uninitialized array??
        }
    }
};

如果我尝试用文字初始化table,如table { new int[10] {} },数组中的所有项目都设置为默认值(0)。为什么?

问题是size将在表之后初始化,因为它们的声明顺序。你需要

class Hashtable 
{
    int size;
    int* table;
    ....

数据成员按其声明顺序进行初始化,而不是按照将它们放置在构造函数初始化列表中的顺序进行初始化。在合理的编译器上,适当的警告级别会告诉您这一点。