繁体   English   中英

C ++中的默认初始化

[英]default initialization in C++

我对C ++中的默认初始化有疑问。 我被告知非POD对象将自动初始化。 但我对以下代码感到困惑。

为什么当我使用指针时,变量i被初始化为0,但是,当我声明一个局部变量时,它不是。 我使用g ++作为编译器。

class INT {
    public: int i;

};

int main () {

    INT* myint1 = new INT;
    INT myint2;
    cout<<"myint1.i is "<<myint1->i<<endl;
    cout<<"myint2.i is "<<myint2.i<<endl;

    return 0;
}

输出是

myint1.i是0

myint2.i是-1078649848

你需要在INT中声明一个c'tor并强制'i'到一个明确定义的值。

class INT {
public:

    INT() : i(0) {}

 ...
};

i仍然是POD,因此默认情况下不会初始化。 无论是在堆栈上还是在堆上分配都没有区别 - 在这两种情况下,如果i未定义,则无关。

在这两种情况下都没有初始化,你很幸运在第一个中得到0

首先,你的INT类是POD。

其次,当某些内容“自动初始化”时(对于自动或动态对象),这意味着会自动调用构造函数 没有其他“自动”初始化方案(对于自动或动态对象); 所有其他方案都需要“手动”指定的初始化程序。 但是,如果构造函数没有执行任何操作来执行所需的初始化,则不会进行该初始化。 必要时,您有责任编写该构造​​函数。

在您的示例中的两种情况下,您都应该在对象中获得垃圾。 在new-ed对象的情况下你观察到的0纯粹是偶然的。

这取决于编译器。 这里最大的区别是设置为new Something的指针指的是堆中的某些内存区域,而局部变量存储在堆栈中。 也许你的编译器会将堆内存归零,但不会打扰堆栈内存; 无论哪种方式,你都不能指望任何一种方法归零你的记忆。 您应该使用Win32中的ZeroMemory或C标准库中的memset来将内存归零,或者在INT的构造函数中设置i = 0。

对于类或结构类型,如果在定义变量时没有告诉它使用哪个构造函数,则调用默认构造函数。 如果您没有定义默认构造函数,那么编译器会为您创建一个。 如果类型不是类(或结构)类型,那么它不会被初始化,因为它没有构造函数,更不用说默认构造函数了(所以没有像int这样的内置类型将被默认初始化)。

因此,在您的示例中,myint1和myint2都默认使用编译器为INT声明的默认构造函数构造。 但由于这不会初始化INT中的任何非类/结构变量,因此INT的i成员变量未初始化。

如果你想要初始化我,你需要为INT编写一个默认构造函数来初始化它。

我们刚刚有了这个主题,你可以在这里找到一些说明。

如果向类中添加更多变量,则最终会得到非初始化的成员变量。

这对于非POD对象来说是正确的,但是你的对象是POD,因为它没有用户定义的构造函数,只包含POD本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM