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的原因
一个例子
这允许程序员分配大块内存作为缓冲区,以后可以使用placementnew
初始化对象
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的原因
一个例子
这允许程序员分配大块内存作为缓冲区,以后可以使用placementnew
初始化对象
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()
则将未初始化的成员设置为零。如果有人反对我所写的内容,我很感兴趣。请留下评论。如果有人反对我写的东西,我很感兴趣。请留下评论。