typedef struct:默认初始化

时间:2010-06-30 21:55:35

标签: c++ struct typedef

typedef struct foo
{
    bool my_bool;
    int my_int;
} foo;

在上面的示例中,我了解 my_bool 会随机初始化为true或false,但 my_int 呢?我假设 my_int 默认初始化为0,但似乎并非如此。

以这种方式定义结构似乎与初始化列表不兼容,那么将 my_bool my_int 分别初始化为false和0的最佳方法是什么?

7 个答案:

答案 0 :(得分:20)

类型不会“初始化”。只初始化某种类型的对象。它们如何以及何时初始化取决于相应对象的定义方式和位置。你没有在你的问题中提供任何对象的定义,所以你的问题本身并没有多大意义 - 它缺乏必要的背景。

例如,如果您定义类型为foo

的静态对象
static foo foo_object; // zeros

它将自动进行零初始化,因为具有静态持续时间的所有对象始终自动进行零初始化。

如果你定义一个没有初始化程序的foo类型的自动对象,它将保持未初始化

void func()
{
   foo foo_object; // garbage
}

如果您使用聚合初始值设定项定义类型为foo的自动对象,则会根据该初始值设定项对其进行初始化

void func()
{
   foo foo_object1 = { 1, 2 }; // initialized
   foo foo_object2 = {}; // initialized with zeros
}

如果您使用new分配对象并且不提供初始化程序,则它将保持未初始化

foo *p = new foo; // garbage in `*p`

但是如果你使用()初始值设定项,它将被零初始化

foo *p = new foo(); // zeros in `*p`

如果使用foo表达式创建类型为foo()的临时对象,则该表达式的结果将为零初始化

bool b = foo().my_bool; // zero
int i = foo().my_int; // zero

因此,再次,在您的特定情况下,初始化详细信息取决于您现在创建类型的对象,而不是您的类型本身。您的类型本身没有固有的初始化工具,也不会以任何方式干扰初始化。

答案 1 :(得分:11)

首先,声明struct的方式是C语言。在C ++中你应该这样做:

struct foo 
{
    bool my_bool;
    int my_int;
};

在C和C ++中,初始化是与分配分开的一步。如果您始终要初始化结构的成员,请使用以下默认初始化语法:

struct foo
{
    bool my_bool{};
    bool my_int{};
};

在旧版本的C ++中,您需要手动编写一个初始化所有成员的默认构造函数(上面的新语法只是糖):

struct foo 
{
    foo() : my_bool(), my_int() { }
    bool my_bool;
    int my_int;
};

正如@sbi所说,如果你想手动初始化结构,即使没有默认的构造函数,你也可以foo myFoo = foo();

答案 2 :(得分:11)

实现默认构造函数:

typedef struct foo 
{ 
    foo()
    : my_bool(false), my_int(0)
    {
        // Do nothing
    }
    bool my_bool; 
    int my_int; 
} foo; 

答案 3 :(得分:4)

有一个默认构造函数:

struct foo {
    foo() : my_bool(false), my_int(0) {}
    bool my_bool;
    int  my_int;
};

答案 4 :(得分:2)

您没有在该代码中创建任何对象。初始化是在创建对象时完成的,并且不是通过声明结构的方式特别隐藏。

例如,以下内容将布尔值初始化为false,将整数初始化为0

foo f = { };

请注意,您的结构只是 typdefed 。您尚未创建对象。像其他人一样,你可以在C ++中省略typedef并只声明结构,你仍然可以通过只说foo来引用类型。

如果在定义对象时省略显式初始化,那么确保不进行初始化,除非在命名空间范围内定义对象或在本地定义为static(在这种情况下所有成员都是零初始化)或该类具有用户定义的默认构造函数,可以相应地进行初始化。

答案 5 :(得分:1)

只要您以C方式声明结构,就可以使用zeromemory精确地清空sizeof(foo)个字节,从而将所有值默认为0

在C ++中,您可以使用构造函数定义结构,如果需要,可以将值设置为某些默认值。

答案 6 :(得分:1)

c和c ++根本不初始化变量。它们包含发生在它们之前的内存位置的任何内容。这也适用于类和结构中的成员变量,除非您专门将它们初始化为值。