typedef struct:默认初始化

Ste*_*orn 11 c++ struct typedef

typedef struct foo
{
    bool my_bool;
    int my_int;
} foo;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我理解my_bool将被随机初始化为true或false,但是my_int呢?我假设my_int默认初始化为0,但似乎并非如此.

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

AnT*_*AnT 20

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

例如,如果定义类型的静态对象 foo

static foo foo_object; // zeros
Run Code Online (Sandbox Code Playgroud)

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

如果在foo没有初始化程序的情况下定义类型的自动对象,它将保持未初始化状态

void func()
{
   foo foo_object; // garbage
}
Run Code Online (Sandbox Code Playgroud)

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

void func()
{
   foo foo_object1 = { 1, 2 }; // initialized
   foo foo_object2 = {}; // initialized with zeros
}
Run Code Online (Sandbox Code Playgroud)

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

foo *p = new foo; // garbage in `*p`
Run Code Online (Sandbox Code Playgroud)

但是如果使用()初始化程序,它将被初始化为零

foo *p = new foo(); // zeros in `*p`
Run Code Online (Sandbox Code Playgroud)

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

bool b = foo().my_bool; // zero
int i = foo().my_int; // zero
Run Code Online (Sandbox Code Playgroud)

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


Cog*_*eel 11

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

struct foo 
{
    bool my_bool;
    int my_int;
};
Run Code Online (Sandbox Code Playgroud)

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

struct foo
{
    bool my_bool{};
    bool my_int{};
};
Run Code Online (Sandbox Code Playgroud)

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

struct foo 
{
    foo() : my_bool(), my_int() { }
    bool my_bool;
    int my_int;
};
Run Code Online (Sandbox Code Playgroud)

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


rtu*_*ado 11

实现默认构造函数:

typedef struct foo 
{ 
    foo()
    : my_bool(false), my_int(0)
    {
        // Do nothing
    }
    bool my_bool; 
    int my_int; 
} foo; 
Run Code Online (Sandbox Code Playgroud)

  • 我认为这要好得多,这取决于数据成员的隐式初始化.最重要的是,如果您正在编写平台中立代码.即使您希望所有编译器的行为相同,但明确您的意图仍然很好.它有助于提高可读性,可维护性,并帮助那些追随你的人. (2认同)