簡體   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