C 列表初始化的好處

2021-10-08 01:34:18 字數 996 閱讀 8193

對列表初始化的好處的個人理解,邊學邊歸納理解,如果有錯誤希望能夠指出;

中英文表達上的不對等,我自己定義中的初始化列表可以分為兩類,乙個是類建構函式的初始化列表成員賦值方式;乙個是使用initializer_list為某個變數初始化

首先對於類的建構函式,推薦使用列表初始化的原因是,it『s eitherrequiredorfast

required:必須使用列表初始化的場合

faster:效率高

乙個派生類物件(對基類定義的成員變數)構造步驟為:

呼叫基類建構函式

基類呼叫成員變數各自的建構函式

而如果每一層基類/派生類通過初始化列表的方式,則不管繼承包裹了多少層,完成類成員變數的構造,只呼叫一次成員自己的建構函式,像這樣:

class a ;

string s;

}class b : public ; //實際完成構造的仍然是s(tmp)這一句

}

關於很多人說的不需要呼叫建構函式從而提高效率這點仍然沒有完全理解:基類的建構函式仍然是需要被呼叫的,只是至少在建構函式體執行之前,就已經完成了所有成員變數的構造;

但是對於聚合類這種沒有建構函式的類,初始化列表的直接初始化方式顯然是更方便直觀的

另外個人感受:通過初始化列表方式進行初始化的方式,更統一且直觀,不容易出錯。限制養成了寫**時習慣性的先完成父類的構造、成員的給值,再在函式體中完成剩下的邏輯。這也可以算是效率上的提公升

對通過初始化列表方式給物件初始化:

使用初始化列表還是值初始化方式效率上的差別沒有那麼明顯,尤其是內建型別例如int string這些;但是仍然有很多理由選擇初始化列表:

另外的另外,好奇會不會是,通過列表初始化方式給變數初始化的字面值並不會被實際的儲存?沒有搜到vs檢視字面值常量儲存位址的方法,這點待查資料

當然,不要過度糾結在書面意義或者統計意義上的細節上,大概了解些底層原地,使用中再慢慢感受到這種方法的好處

C 建構函式初始化列表的好處

c 類對像構造時,需要對類成員變數完成初始化賦值操作。使用初始化列表完成這步操作在效能上有益處。什麼好處呢?擺道理顯得不夠徹底。看書不如做實驗。讓我們結合執行過程來檢視。考慮如下示例 derive 類建構函式兩個 base 型別的引數,分別賦給該類兩個 base 型別的成員變數 b1 b2,乙個使用...

c 初始化列表

與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。struct foo 初始化列表 建構函式的兩個執行階段 從概念上來講,建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段 初始化階段 所有...

C 初始化列表

與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c 中,struct和class的唯一區別是預設的克訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的 都以struct來演示。struct foo 初始化列表 ...