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的最佳方法是什么?
答案 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 ++根本不初始化变量。它们包含发生在它们之前的内存位置的任何内容。这也适用于类和结构中的成员变量,除非您专门将它们初始化为值。