C++ C++;原语的默认构造函数?

C++ C++;原语的默认构造函数?,c++,c++11,C++,C++11,因此,我的理解是,如果我有SomeType foo,将调用SomeType的默认构造函数,并初始化foo。但是如果我有int x——根据规范这是未定义的。为什么不调用默认构造函数(int()) 为什么不调用默认构造函数(int()) 如果程序员希望这些对象保持未初始化状态,那么该语言不希望增加调用构造函数和初始化这些对象的成本 澄清: int x; 不会导致未定义的行为。使用x而不对其进行初始化或显式设置值是导致未定义bahavior的原因 一个例子 这允许程序员分配大块内存作为缓冲区,以后可

因此,我的理解是,如果我有
SomeType foo
,将调用
SomeType
的默认构造函数,并初始化
foo
。但是如果我有
int x
——根据规范这是未定义的。为什么不调用默认构造函数(
int()

为什么不调用默认构造函数(
int()

如果程序员希望这些对象保持未初始化状态,那么该语言不希望增加调用构造函数和初始化这些对象的成本

澄清:

int x;
不会导致未定义的行为。使用
x
而不对其进行初始化或显式设置值是导致未定义bahavior的原因

一个例子 这允许程序员分配大块内存作为缓冲区,以后可以使用placement
new
初始化对象

char* buffer = new char[SOME_LARGE_BUFFER_SIZE];
后来

// Construct an object in dynamically allocated memory, buffer.
SomeObject* obj = new (buffer+offset) SomeObject;
由于使用了
缓冲区
,初始化
缓冲区
的每个元素对用户来说没有任何价值。考虑到用例,初始化这些对象的成本是不必要的

为什么不调用默认构造函数(
int()

如果程序员希望这些对象保持未初始化状态,那么该语言不希望增加调用构造函数和初始化这些对象的成本

澄清:

int x;
不会导致未定义的行为。使用
x
而不对其进行初始化或显式设置值是导致未定义bahavior的原因

一个例子 这允许程序员分配大块内存作为缓冲区,以后可以使用placement
new
初始化对象

char* buffer = new char[SOME_LARGE_BUFFER_SIZE];
后来

// Construct an object in dynamically allocated memory, buffer.
SomeObject* obj = new (buffer+offset) SomeObject;

由于使用了
缓冲区
,初始化
缓冲区
的每个元素对用户来说没有任何价值。考虑到用例,初始化这些对象的成本是不必要的。

您的直觉实际上是正确的。事后看来
intx未初始化(以及
sometypefoo;
可能使某些成员未初始化)是错误和安全错误的持续来源。理性是指,“不为你不需要的东西付费”,这是C++的核心理念。现在,初始化一个本地
int
变量可能是性能问题的根源,这似乎很可笑,特别是对于今天的优化器,但在过去是这样的

今天,仍然需要在定义变量之后对其进行未初始化(例如,考虑需要在之后填充的数组)。但是C++中处理的方式是不幸的(事后看来)。 更好的选择是不允许未初始化的变量,除非程序员明确要求,例如:

int x = unitialized; // where uninitialized is a keyword
。。。再一次,事后看来


今天,几乎所有的指南都建议始终初始化变量,为此,您可以使用一些技巧:

  • 始终使用
    {}
    初始化变量,例如
    intx{}
  • (几乎)总是使用auto,这会强制您进行初始化,例如
    autox=int{}

    • 你的直觉其实是对的。事后看来
      intx未初始化(以及
      sometypefoo;
      可能使某些成员未初始化)是错误和安全错误的持续来源。理性是指,“不为你不需要的东西付费”,这是C++的核心理念。现在,初始化一个本地
      int
      变量可能是性能问题的根源,这似乎很可笑,特别是对于今天的优化器,但在过去是这样的

      今天,仍然需要在定义变量之后对其进行未初始化(例如,考虑需要在之后填充的数组)。但是C++中处理的方式是不幸的(事后看来)。 更好的选择是不允许未初始化的变量,除非程序员明确要求,例如:

      int x = unitialized; // where uninitialized is a keyword
      
      。。。再一次,事后看来


      今天,几乎所有的指南都建议始终初始化变量,为此,您可以使用一些技巧:

      • 始终使用
        {}
        初始化变量,例如
        intx{}
      • (几乎)总是使用auto,这会强制您进行初始化,例如
        autox=int{}

      因为
      int
      不是类。非类类型没有构造函数。此外,仅仅因为您有一个类(例如示例中的
      SomeType
      ),并不意味着它的默认构造函数实际上会做一些有用的事情。构造函数可能未初始化成员变量。在类体中隐式生成默认构造函数或
      =default
      ed的类的行为方式相同。做
      MyClass x
      可以使某些成员未初始化,而
      MyClass()
      会将未初始化的成员设置为零。因为
      int
      不是类。非类类型没有构造函数。此外,仅仅因为您有一个类(例如示例中的
      SomeType
      ),并不意味着它的默认构造函数实际上会做一些有用的事情。构造函数可能未初始化成员变量。在类体中隐式生成默认构造函数或
      =default
      ed的类的行为方式相同。做
      MyClass x
      可以使一些成员未初始化,而
      MyClass()
      则将未初始化的成员设置为零。如果有人反对我所写的内容,我很感兴趣。请留下评论。如果有人反对我写的东西,我很感兴趣。请留下评论。