在C ++类中,是否必须初始化数组的成员变量?

时间:2018-10-31 04:13:46

标签: c++ c++11

例如:

class Cls
{
private:
    int x;
    int y;
    int arr[10];

public:
    Cls();
};

Cls::Cls() : x(0), y(0) {}

我的理解是,未初始化的数组将具有垃圾值。只要我不编写期望数组在填充之前具有特定值的代码,不初始化数组是否存在任何问题?还是我需要像这样的东西作为构造函数:

Cls::Cls() : x(0), y(0), arr() {}

2 个答案:

答案 0 :(得分:3)

初始化数组成员不需要Cls的构造函数。未能初始化将使元素保留 indeterminate 值。与流行的看法相反,具有不确定值的对象不仅仅是具有未指定值的对象;它还具有一些不确定性。实际上,在先向它们写入确定的值之前尝试读取它们会导致未定义的行为。因此,通常建议尽快设置这些值。

答案 1 :(得分:1)

如果您的逻辑是您在设置它们之前绝对不会编写访问它们的代码,那么您无需初始化它们。例如,如果您直起头来根本不使用该数组,则只需将它们统一化即可。

但是,最好将它们初始化,因为没有理由不这样做,即使将它们初始化为错误的值也是如此。可能会发生的事情是,尽管您总是在阅读 now 之前写过,但是将来可能会改变。走了6个月之后,有人可能会重构某些东西,现在在写之前先进行读取。因为这是未定义的行为,所以您的程序似乎可以正确运行,或者可以在其计算机上运行,​​但在另一台计算机上崩溃。如果初始化它们,就不会遇到这些问题。

也许您担心的是0是一个有效值,并且您不希望程序意外地获得该值,所以您希望弄清楚它没有正确初始化,但是由于未定义的行为,您可能会得到0或其他有效值或崩溃,并且可能不一致。如果正确初始化所有内容,您可能会感谢自己。

C ++警察或编译器不会阻止您这样做,并且您的程序仍然可以很好地构成,但是您也可以通过初始化它们来保证它。