C/C++編程筆記:什么時候在C++中使用初始化列表?

初始化程序列表用于初始化類的數(shù)據(jù)成員。構(gòu)造函數(shù)將要初始化的成員列表表示為逗號分隔的列表,后跟冒號。下面是一個使用初始化程序列表初始化Point類的x和y的示例:
上面的代碼只是初始化列表的語法示例。在上面的代碼中,x和y也可以在構(gòu)造函數(shù)中輕松初始化。但是在某些情況下,構(gòu)造函數(shù)內(nèi)部的數(shù)據(jù)成員的初始化無法正常工作,必須使用Initializer List。以下是這種情況:
1)對于非靜態(tài)const數(shù)據(jù)成員的?
初始化:必須使用Initializer List初始化const數(shù)據(jù)成員。在以下示例中,“ t”是Test類的const數(shù)據(jù)成員,并使用初始化列表進(jìn)行初始化。在初始化列表中初始化const數(shù)據(jù)成員的原因是因?yàn)闆]有為const數(shù)據(jù)成員單獨(dú)分配內(nèi)存,因此將其折疊在符號表中,因此我們需要在初始化列表中對其進(jìn)行初始化。?
同樣,它是一個參數(shù)化的構(gòu)造函數(shù),我們不需要調(diào)用賦值運(yùn)算符,這意味著我們避免了一個額外的操作。?
2)對于引用成員的初始化:?
必須使用“初始化列表”來初始化引用成員。在以下示例中,“ t”是Test類的引用成員,并使用初始化列表進(jìn)行初始化。
3)對于沒有默認(rèn)構(gòu)造函數(shù)的成員對象的初始化:?
在以下示例中,類“ A”的對象“ a”是類“ B”的數(shù)據(jù)成員,而“ A”沒有默認(rèn)構(gòu)造函數(shù)。初始化列表必須用于初始化“ a”。
如果類A同時具有默認(rèn)構(gòu)造函數(shù)和參數(shù)化構(gòu)造函數(shù),則如果要使用默認(rèn)構(gòu)造函數(shù)初始化“ a”,則不必使用“初始化列表”,而必須使用參數(shù)化構(gòu)造函數(shù)初始化“ a”。?
4)對于基類成員的初始化:與第3點(diǎn)一樣,只能使用Initializer List調(diào)用基類的參數(shù)化構(gòu)造函數(shù)。
5)當(dāng)構(gòu)造函數(shù)的參數(shù)名稱與數(shù)據(jù)成員相同時?
如果構(gòu)造函數(shù)的參數(shù)名稱與數(shù)據(jù)成員名稱相同,則必須使用此指針或“初始化列表”來初始化數(shù)據(jù)成員。在以下示例中,A()的成員名稱和參數(shù)名稱均為“ i”。
6)出于性能方面的考慮:?
最好在Initializer List中初始化所有類變量,而不是在主體內(nèi)分配值。考慮以下示例:?
在這里,編譯器按照以下步驟創(chuàng)建類型為MyClass
1的對象?。類型的構(gòu)造函數(shù)首先被稱為“ a”。?
2.在MyClass()構(gòu)造函數(shù)的內(nèi)部調(diào)用“類型”的賦值運(yùn)算符進(jìn)行賦值?
? ? 變量= a;
3.然后,由于“類型”的析構(gòu)函數(shù)超出范圍,因此最終將其稱為“ a”。
現(xiàn)在考慮使用具有初始化程序列表的MyClass()構(gòu)造函數(shù)的相同代碼?
使用“初始化程序列表”,編譯器將執(zhí)行以下步驟:?
1.調(diào)用“ Type”類的參數(shù)化構(gòu)造函數(shù)進(jìn)行初始化:變量(a)。初始化程序列表中的參數(shù)用于直接復(fù)制構(gòu)造“變量”。?
2.“類型”的析構(gòu)函數(shù)被稱為“ a”,因?yàn)樗隽朔秶?/p>
從本示例可以看出,如果在構(gòu)造函數(shù)主體內(nèi)使用賦值,則有三個函數(shù)調(diào)用:構(gòu)造函數(shù)+析構(gòu)函數(shù)+一個附加賦值運(yùn)算符調(diào)用。如果我們使用Initializer List,則只有兩個函數(shù)調(diào)用:復(fù)制構(gòu)造函數(shù)+析構(gòu)函數(shù)調(diào)用。
以上就是今天的全部內(nèi)容了。每日分享小知識,希望對你有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~
微信公眾號:C語言編程學(xué)習(xí)基地
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
