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_bool和my_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)
| 归档时间: |
|
| 查看次数: |
42963 次 |
| 最近记录: |