何时将数组自动初始化为其默认数据类型?

时间:2019-11-16 15:40:04

标签: c++ arrays initialization

编译器何时将数组自动初始化为其默认数据类型?

我知道在此示例中,将初始化数组,但事实是我期望的是char的(reading here\0值,而不是在我的控制台中有spaces(在至少这是我的想法,因为什么都没有。

#define MAX_LENGTH 25

// Array global
int vector[MAX_LENGTH];
char vector_char[MAX_LENGTH];

int main()
{
    //Print int array
    for(int i = 0;i < MAX_LENGTH; i++)
    {
        cout << vector[i] << " ";                        // All outputs 0
    }
    cout << endl;

    //Print char array and output text to see that there is 
    //Something printed
    cout << "start";
    for(int i = 0;i < MAX_LENGTH; i++)
    {
        cout << vector_char[i] << " ";                     //All outputs...
    }
    cout <<"end"<< endl;
    return 0;
}

我遇到的其他两种情况是数组在函数内部(其中值将是“垃圾”或“不可预测的”),例如:

int main()
{
    int internal_vector[MAX_LENGTH];

    for(int i = 0;i < MAX_LENGTH; i++)
    {
        cout << internal_vector[i] << " ";
    }
    cout << endl;
    return 0;
}

,当数组是类的成员时,另一个(如果您尝试任何操作,您将惊讶地发现数组将包含垃圾值:

class MyClass
{
private:
    int array[100];
...
}

那么,何时将数组自动初始化为其默认数据类型,何时应该使自己的函数初始化每个元素?

1 个答案:

答案 0 :(得分:2)

全局对象有static storage duration,从一开始它们就是zero-initialized

  

对于任何具有静态或线程本地存储持续时间that is not subject to constant initialization (since C++14)的命名变量,在进行任何其他初始化之前。

     

如果T是标量类型,则对象的初始值为明确转换为T的积分常数零。

     

如果T为数组类型,则每个元素都将初始化为零

这意味着vector的所有元素都将初始化为0vector_char的所有元素都将初始化为'\0'

另一方面,internal_vector的所有元素都将初始化为default initialization中的不确定值。

  

如果T是数组类型,则数组的每个元素都将默认初始化;

     

否则,什么也不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。

     

具有自动和动态存储持续时间的非类变量的默认初始化会产生具有不确定值的对象(静态和线程本地对象获得zero initialized

请注意,array有点复杂,其存储持续时间取决于实例的声明方式。