c++ - 内置类型的成员是否默认初始化?

标签 c++ constructor primitive-types

我最近在我的一个类中遇到了一个问题,因为我没有在我的构造函数初始化列表中设置指向 NULL 的指针,所以当我运行程序时它包含垃圾。

然而,虽然我知道在堆栈上声明但未初始化的内置类型的实例将包含随机值,但我很确定我在某处读到过,因为类成员未明确放置在构造函数初始化列表中调用它们的默认构造函数,对于内置类型,这也会发生,插入代码,如大多数平台上的伪构造函数,将它们设置为零我还认为我会在某些地方的“Thinking in C++”中阅读在构建对象之前的某些情况下,其内存将被清零,但我在这两种情况下似乎都错了。

谁能帮我确认一下,
a) 内置类型成员的初始化是否与用户定义的构造函数是否定义有任何关系,
b) 内置类型的成员是否总是需要手动初始化,并且
c) 在调用构造函数之前,是否存在对象的存储被清零的情况?

此外,在对此进行研究时,我看到使用了“默认初始化”和“零初始化”这两个术语 - 说法之间有区别吗:

T a;

T a();

?我认为第一种形式只是用来防止编译器将第二种形式作为函数声明时出现歧义。

非常感谢您的宝贵时间,

星际力量

最佳答案

首先让我们回顾一些示例和正确的术语。

T a1;            // default initialization
T a2{};          // value initialization
T();             // also value initialization
new T;           // default initialization
new T();         // value initialization
new T{};         // also value initialization
class C1 {
    C1() {}
    T x;
};               // no initializer for C1::x; default-initialized
class C2 {
    T x;
};               // implicit default constructor default-initializes C2::x
class C3 {
    C3() : x() {}
    T x;
};               // C3::x will be value-initialized.
class C4 {
    C4() : x{} {}
    T x;
};               // C4::x will also be value-initialized.
// DANGER
T a();           // declares a function; not value initialization (quirk of C++)

一般规则是,当没有初始化器时,为默认初始化,当初始化器为(){}时,为值初始化。请注意,静态和线程局部变量有一个异常(exception),我将在稍后讨论。

对于整数或浮点类型,值初始化将其设置为 0。对于指针类型,值初始化将其设置为 null。默认初始化对标量类型没有任何作用。因此,如果标量类型的对象仅接受默认初始化,则它具有不确定的值。

a) Does initialisation of members of a built-in type have anything to do with wheher a user-defined constructor is defined or not,

类的默认构造函数默认初始化成员。当没有为成员显式提供 mem-initializer 时,成员也会被默认初始化。 C1C2 示例说明了这一点。但是,请注意,当类类型 被值初始化时,并且该类的默认构造函数是隐式定义或显式默认的,该类的成员将被清零。这种归零仅在这种情况下发生,而不会发生在用户提供的默认构造函数中。因此,从这个意义上说,您的问题的答案是"is"。

C1 y1;   // y1 is default-initialized; y1.x is indeterminate
C1 y2{}; // y2 is value-initialized;   y2.x is indeterminate
C2 y3;   // y3 is default-initialized; y3.x is indeterminate
C2 y4{}; // y4 is value-initialized;   y4.x is set to 0
C3 y5;   // y5 is default-initialized; y5.x is set to 0
C3 y6{}; // y6 is value-initialized;   y6.x is set to 0

b) do members of a built-in type always need to be initialised manually, and c) are there any circumstances under which an object's storage is zeroed-out before the constructor is called?

我假设您的意思是“具有内置类型的类成员”。我在上面介绍了它们自动初始化为 0 的情况:其中类对象被值初始化并且其构造函数不是用户提供的(或删除的)。另一种情况是类对象具有静态或线程本地存储持续时间。在这种情况下,成员也会在一开始就被归零,因此它们不可能以不确定的值结束。

关于c++ - 内置类型的成员是否默认初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32359896/

相关文章:

c++ - 重新定义原始类型以快速更改 RAM 使用、更好的可读性(并可能提高性能)

c++ - 如何确定哪个小部件触发了插槽功能?

c++ - 如果 lambda 在运行时被移动/销毁会怎样?

Scala:扩展参数化类时处理不同的构造函数

C++ 编译错误用右值 std::string 构造对象

java - 对原始类型使用常量或枚举

methods - 访问原始 Rust 类型的方法

c++ - 当我以这种方式修改交换函数时会发生什么?

c++ - 序列化二进制结构 gcc vs cl

C++ 忽略构造函数异常的后果