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

C++ 在C++;类,是否必须初始化作为数组的成员变量?,c++,c++11,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() {} 初始化数组成员不需要Cls的构造函数。初始化失败

例如:

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() {}

初始化数组成员不需要
Cls
的构造函数。初始化失败将使元素的值不确定。与流行的观点相反,具有不确定值的对象不仅仅是未指定值的对象;事实上,在首次向它们写入确定值之前,尝试读取它们会导致未定义的行为。因此,通常建议尽快设置值。

初始化数组成员时不需要使用
Cls
的构造函数。初始化失败将使元素的值不确定。与流行的观点相反,具有不确定值的对象不仅仅是未指定值的对象;事实上,在首次向它们写入确定值之前,尝试读取它们会导致未定义的行为。出于这个原因,通常建议尽快设置这些值。

如果您的逻辑是在设置它们之前肯定不会编写访问它们的代码,则不需要初始化它们。例如,如果您完全没有使用阵列,您可以简单地将它们单元化

不过,最好是初始化它们,因为没有理由不这样做,即使您将它们初始化为错误的值。可能发生的情况是,尽管你现在总是在阅读之前写作,但将来可能会发生变化。6个月后,有人可能会重构某些东西,现在读发生在写之前。因为这是未定义的行为,可能您的程序看起来运行正常,或者它可能在他们的机器上工作,但在另一台机器上崩溃。如果你初始化它们,你就不会遇到这些问题

也许您担心的是
0
是一个有效值,您不希望您的程序意外地获得该值,您最好明确它没有正确初始化,但如果行为未定义,您可能会获得
0
或其他有效值或崩溃,并且可能不一致。如果你只是正确地初始化了所有东西,你可能会感谢你自己


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

< P>如果你的逻辑是你肯定不会写代码,在设置它们之前访问它们,那么你就不需要初始化它们了。例如,如果您完全没有使用阵列,您可以简单地将它们单元化

不过,最好是初始化它们,因为没有理由不这样做,即使您将它们初始化为错误的值。可能发生的情况是,尽管你现在总是在阅读之前写作,但将来可能会发生变化。6个月后,有人可能会重构某些东西,现在读发生在写之前。因为这是未定义的行为,可能您的程序看起来运行正常,或者它可能在他们的机器上工作,但在另一台机器上崩溃。如果你初始化它们,你就不会遇到这些问题

也许您担心的是
0
是一个有效值,您不希望您的程序意外地获得该值,您最好明确它没有正确初始化,但如果行为未定义,您可能会获得
0
或其他有效值或崩溃,并且可能不一致。如果你只是正确地初始化了所有东西,你可能会感谢你自己


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

是的,但是如果我不打算读它们,只给它们写信,这真的没关系吗?@ubadub如果你确定在阅读之前会给他们写信,那么让他们不初始化也没关系。(如果你只想写而不想读,那有什么意义呢?)是的,这就是我的意思-我正在写的类存储了一个
size
,指的是写入数组的元素数量,并且永远不会读超过索引
size-1
。有关不确定值和UB-Right的更多细节,请参阅此处,但如果我不打算读它们,只给他们写信并不重要?@ubadub如果你确信在阅读之前会给他们写信,那么让他们不初始化也没关系。(如果你只想写而不想读,那有什么意义?),这就是我的意思-我正在编写的类存储一个
size
,表示写入数组的元素数,并且从不读取超过索引
size-1
。有关不确定值和UB的详细信息,请参阅此处。首先不要使用C样式数组。@n.m.这不是我要求的,是吗?我知道C风格数组的缺点,但在这种特殊情况下,我有义务使用它们。此外,即使我不打算使用它们,也很高兴知道它们是如何工作的。这是一个评论。评论不是答案,它们完全是针对没有被问到的事情。
arr()
是不合法的。如果愿意,可以在C++11及更高版本中说
arr{}
。但是,正如答案所说,不必这样做。就像C++中的任何其他数组或非数组变量一样,类成员也不特殊。我刚刚编译并运行了一个文件,这个文件就是这样做的:
arr()
作为初始值设定项列表的一部分,首先不要使用C样式的数组。@n.m.我不是这样问的,是吗?我知道C风格数组的缺点,但在这种特殊情况下,我有义务使用它们。而且,即使我不打算使用它们,也很高兴知道它们是如何工作的