[英]typedef struct : Default Initialization
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的最佳方法是什么?
類型不會被“初始化”。 只初始化某種類型的對象 。 它們如何以及何時初始化取決於相應對象的定義方式和位置。 你沒有在你的問題中提供任何對象的定義,所以你的問題本身並沒有多大意義 - 它缺乏必要的背景。
例如,如果定義類型為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方式聲明結構,就可以使用zeromemory
將sizeof(foo)
字節精確地置零,從而將所有值默認為0
。
在C ++中,您可以使用構造函數定義結構,如果需要,可以將值設置為某些默認值。
c和c ++根本不初始化變量。 它們包含發生在它們之前的內存位置的任何內容。 這也適用於類和結構中的成員變量,除非您專門將它們初始化為值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.