這三種初始化列表器 初始化器列表 傻傻的分不清楚怎麼辦

時間 2021-06-05 21:42:19

1樓:

題目中列舉了三種初始化列表,其實這些並不屬於同乙個範疇。

第乙個是「資料成員初始化列表「,它屬於建構函式語法的一部分。在類的建構函式中,函式簽名後跟隨者乙個冒號,然後是對基類和類中成員進行初始化。這裡的初始化順序與成員變數的定義順序相同。

應該注意,在建構函式內的通過賦值進行的成員變數「初始化」並不是初始化,而是一次賦值操作,當然,現在的編譯器很智慧型了,通常會對這一部分進行優化,忽略掉第一次被覆蓋的初始化,以避免兩次賦值操作。

classc1;

};第二個是「陣列的初始化」。大括號中的值用於填充陣列的前X個物件,剩餘部分以隱式初始化的方式填充(類物件呼叫預設構造器,整數、浮點數填0)。

intvi[9

]/*第二個*/

;// 初始化結果為

// vi[0] = 3; vi[1] = 6; vi[2] = 84; vi[3] = 7; vi[4...8] = 0;

第三個是「直接列表初始化」中的一種形式,稱作「聚合初始化」。在宣告物件時,如果物件是聚合型別,物件中的成員變數會按照定義順序,由初始化列表中的引數,以拷貝初始化的方式,進行初始化。也就是按照順序,一一對應的將初始化列表中的引數複製到對應的成員變數上。

不過,這裡面你寫有錯誤的。"fgggg"是字元字面量,擁有const char[6]型別,必須由const char *變數持有,或者你用它初始化乙個陣列char pc[6]這也可以。

classc2;

c2vc1

/*第三個*/

;// 效果等同於

// vc1.i1 = 7; vc1.i2 = 76; vc1.i3 = 5;

// vc1.pc = "fgggg" // error, c2::pc應為const char*或者陣列

這裡順著第三種引入第四種,C++20新加入的乙個語法,指派初始化(Designated initialize)。比如對於類c2,只想初始化i1和pc,那麼可以這麼寫。注意,指派初始化中可以缺少一些變數,但是變數的順序需要和定義順序相同。

c2vc1

;// since C++20

進一步的,如果乙個聚合包含了乙個聚合型別,它們還可以巢狀的使用列表初始化進行初始化。比如,這裡將c2.pc修改為陣列,那麼上面所說的聚合初始化就是巢狀的了。

classc2;

c2vc1

;// 等價於

c2vc2

};不過目前(C++20),巢狀的列表初始列表中巢狀的部分還無法使用指派語法,陣列也不可以使用指派語法對個別元素進行初始化,儘管這些在C中可行。

當物件不是聚合型別時,大括號的初始化列表通常會被試做呼叫建構函式的引數列表。比如,將c1中成員變數改為private許可權並提供乙個接受三個引數的建構函式,那麼上面的初始化會變為建構函式的呼叫。

classc1;

};c1v1;

// 呼叫建構函式c1::c1(int, int, int)

C++11中還引入了初始化列表物件std::initializer_list,它可以通過大括號列表的語法構造,像一般的物件那樣使用。通常用作函式引數,以接受大括號列表。

這個可以參考cppreference的例子,std::initializer_list。

這三種初始化方法有什麼區別?

As an added syntactical bonus when initializing an array,you can write the following String names Notice that on the right of the assignment operator ...

C 類本身的初始化和靜態欄位的初始化到底發生在什麼時候?

餘葉 其實就兩個構造器。乙個是靜態的,乙個是普通的。靜態構造器得需要你第一次訪問到該類的時候會被觸發。建立的時候,包括 static 成員變數的初始化和static構造器,其實 static 成員變數會整合進static構造器裡面的。而普通成員變數也會整合進普通構造器裡面的。 天煞 如 Sai說的,...

如何初始化整個redux應用?

昨夜星辰 這是我自己基於redux 封裝 1 處理Redux的reducer集中管理的問題 2 防止action的type重複問題 3 離開頁面再次進入該頁面的資料初始化問題 程墨Morgan 首先,Redux的store也不是一定要存在於根節點上,可以存在於任何一層,雖然官方認為乙個網頁中乙個St...