繁体   English   中英

typedef struct:默认初始化

[英]typedef struct : Default Initialization

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

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

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

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

例如,如果定义类型为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

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

首先,声明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();

实现默认构造函数:

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

有一个默认的构造函数:

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

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

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

foo f = { };

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

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

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

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

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

暂无
暂无

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

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