C++ 为什么这些成员没有被默认初始化?

C++ 为什么这些成员没有被默认初始化?,c++,C++,在以下代码中,我收到以下警告消息: 成员“year”未在此构造函数中初始化 成员“month”未在此构造函数中初始化 成员“day”未在此构造函数中初始化 但是,对于uint32\u t类型,我希望成员默认初始化为0 typedef uint32_t bmd2_uint32; class UnitTestCInterface : public UnitTest { { private: bmd2_uint32 year; bmd2_uint32 month; bm

在以下代码中,我收到以下警告消息:

成员“year”未在此构造函数中初始化

成员“month”未在此构造函数中初始化

成员“day”未在此构造函数中初始化


但是,对于uint32\u t类型,我希望成员默认初始化为0

typedef uint32_t bmd2_uint32;

class UnitTestCInterface : public UnitTest {
{
  private:
    bmd2_uint32 year;
    bmd2_uint32 month;
    bmd2_uint32 day;
    ...
  
  public:
    UnitTestCInterface() 
      : filename(nullptr), UnitTest("UNIT TEST: C Interface") { };

为什么这些成员没有被默认初始化,我能做些什么?

您可以使用初始化列表初始化它们:

UnitTestCInterface() 
      : year(0),month(0),day(0), filename(nullptr), UnitTest("UNIT TEST: C Interface")
     { };

您可以使用初始化列表对其进行初始化:

UnitTestCInterface() 
      : year(0),month(0),day(0), filename(nullptr), UnitTest("UNIT TEST: C Interface")
     { };


我能做些什么:你可以初始化它们。“但是,我希望成员默认为初始化,比如说,Unt32”类型的0,“这不是C++所做的。讽刺的是,C++并没有说基本类型有隐含的内在初始化器。因此,需要显式调用uint32\u t()以获得零。静态存储也会用零填充内容。获取基本类型“自动初始化”的唯一方法是将它们声明为
静态
全局
——在这种情况下,当加载代码时,它们将被设置为零(因为它们的内存是在程序加载时分配的,而不是在运行时分配的)。对于所有其他情况,你必须自己做艰苦的工作。如果有一个默认构造函数,我能做些什么:你可以初始化它们。“但是,我希望成员默认初始化为,例如,UTI32 32类型的0”,这不是C++所做的。挖苦。C++并没有说基本类型有隐含的内在初始化器。因此,需要显式调用uint32\u t()以获得零。静态存储也会用零填充内容。获取基本类型“自动初始化”的唯一方法是将它们声明为
静态
全局
——在这种情况下,当加载代码时,它们将被设置为零(因为它们的内存是在程序加载时分配的,而不是在运行时分配的)。对于所有其他情况,您必须自己完成这项艰巨的工作。如果有一个默认构造函数呢?两个
?当心秩序,我能用构造器的主体吗?@billz,好主意。我应该更加小心。@JakeLiquiorBlues,你可以在构造函数中做任何你想做的事情,包括分配成员,但我相信使用初始化列表是标准的做法。@JakeLiquiorBlues:一般来说,在构造函数上使用初始化列表(如本答案所示)来初始化类的数据成员。如果您在构造函数的主体中赋值,它只是赋值,而不是初始化。这在示例代码中不是问题,但是如果您有const或reference成员,那么给它们赋值的唯一方法是通过初始值设定项列表,因为您无法为它们赋值。两个
?当心秩序,我能用构造器的主体吗?@billz,好主意。我应该更加小心。@JakeLiquiorBlues,你可以在构造函数中做任何你想做的事情,包括分配成员,但我相信使用初始化列表是标准的做法。@JakeLiquiorBlues:一般来说,在构造函数上使用初始化列表(如本答案所示)来初始化类的数据成员。如果您在构造函数的主体中赋值,它只是赋值,而不是初始化。这在示例代码中不是问题,但是如果您有const或reference成员,那么给它们赋值的唯一方法是通过初始值设定项列表,因为您无法为它们赋值。