C++變量的初始化,默認(rèn)初始化,值初始化的區(qū)別等(作為初學(xué)的臨時理解)

William-Adolphe Bouguereau

讀C++primer有一些強(qiáng)迫癥,里面一些雜亂的知識點不理清楚總覺得不好

于是總結(jié)了C++primer和網(wǎng)上的一些文章,在g++上做過一些測試,臨時的寫下了這些筆記

初學(xué)C++,很多地方都是猜測,是為了方便自己理解

發(fā)出來希望有高手可以指出錯誤,救我于歧途,或者加以補(bǔ)充

本意不是作為教程,只是個人總結(jié),而且本人較懶,以前的源碼找不到也懶得寫了,所以本文高清無碼

1.初始化方式的區(qū)別


直接初始化——拷貝初始化 (容易區(qū)分,只在下面列表做個分類)

默認(rèn)初始化——值初始化 (重點談)

符號 類型 說明
no 不初始化 (本質(zhì)上都是默認(rèn)初始化)
= 拷貝初始化 (元素必須相同)
() 直接初始化 (根據(jù)構(gòu)造函數(shù)的不同)
={} / {} 直接初始化 (給元素初始化)

字面值和對象名可以通用,只要是同一類型 (string不是同一類型也可以,但加法有問題)

值初始化 :有顯式初始化(即只要存在上述后三種,包括括號或列表元素過少) + 全局/靜態(tài)內(nèi)置類型
默認(rèn)初始化 :無顯式初始化(不包括括號或列表元素過少) - 全局/靜態(tài)內(nèi)置類型

內(nèi)置類型的全局靜態(tài)一定會值初始化,就算啥也沒寫。

執(zhí)行類的默認(rèn)構(gòu)造函數(shù),屬于默認(rèn)初始化。

2.內(nèi)置類型


無顯式初始化

  • 靜態(tài)或全局:執(zhí)行值初始化

  • 塊內(nèi):未初始化(默認(rèn)初始化)

猜測
內(nèi)置類型的默認(rèn)初始化就是地址上原先的值;所以全局、靜態(tài)、列表元素過少等情況,其實執(zhí)行的是值初始化;為了某種現(xiàn)實原因,全局、靜態(tài)、列表元素過少,自動執(zhí)行值初始化;空的 {} / ={} / () 屬于值初始化;

有顯式初始化

通通屬于值初始化

1.有字面值或?qū)ο髸r

符號 說明
=x 可以
(x) 可以
={x} / {x} 可能報錯,信息丟失風(fēng)險

2.字面值或?qū)ο鬄榭諘r

符號 說明
= 非法
() new數(shù)組 、 普通內(nèi)置等可以執(zhí)行值初始化 ,一般數(shù)組不可以
={} / {} 數(shù)組、一般情況等可以執(zhí)行值初始化,參考列表成員過少,執(zhí)行值初始化

3.標(biāo)準(zhǔn)庫類


1.有字面值或?qū)ο髸r

符號 說明
=x 只能是同一類型的字面值或?qū)ο?/td>
(x) 取決于構(gòu)造函數(shù) ; 容器往往可以批量賦值,如(n,‘a(chǎn)’)
={x} / {x} 填入同一類型 ; 容器往往可以批量賦值,如 {n,‘a(chǎn)’} ,不懂實現(xiàn),可能是運(yùn)算符重載

2.字面值或?qū)ο髸r為空

符號 說明
= 非法
() 不確定,取決于庫函數(shù)的代碼怎么寫的
={} / {} 參考列表成員過少,執(zhí)行值初始化,實際調(diào)用的是默認(rèn)構(gòu)造函數(shù),同默認(rèn)初始化

4.初學(xué)者自定義的簡單類


1.有字面值或?qū)ο髸r

符號 說明
=x 只能是同一類型的字面值或?qū)ο?/td>
(x) 構(gòu)造函數(shù)決定
={x} / {x} 只能是同一類型的字面值或?qū)ο?/td>

2.字面值或?qū)ο鬄榭?/h2>
符號 說明
= 非法
() 非法
={} / {} 參考列表成員過少,執(zhí)行值初始化,實際調(diào)用默認(rèn)構(gòu)造函數(shù),同默認(rèn)初始化

總結(jié)性記(wu)憶(jie)


  1. 除開靜態(tài)內(nèi)置安全方便起見,什么都不寫就執(zhí)行默認(rèn)初始化

    只不過內(nèi)置類型默認(rèn)初始化就是不初始化,直接用地址上的原有數(shù)據(jù),效率高

    類還有個默認(rèn)構(gòu)造函數(shù),效率低。

  2. 有 = 和()和 {} 這些符號。只要你這個類型支持,就屬于值初始化。關(guān)鍵是有一些不支持它為空!

    那屬于什么?屬于ERROR!錯誤!

  3. =不談,兩邊必須是一種東西,對于容器或內(nèi)置數(shù)組,右邊寫它的一個元素,如,int a[10]=2或者vector<string> v1="yeats",肯定錯

  4. ( )的話。用在類上空就錯!因為不寫才是默認(rèn)構(gòu)造!內(nèi)置類型和有些標(biāo)準(zhǔn)庫可以為空,不知道是什么騷操作。運(yùn)算符重載好像。

  5. {} 列表好理解。就列表里面填它的同類或者元素。是個數(shù),里面就填數(shù),是個數(shù)組,里面依然填數(shù)。用列表只是為了方便一堆一樣的類型, 一起給你填進(jìn)去。


  1. 列表元素只有一個?甚至就只有個括號?沒關(guān)系 ,用了列表就是一條龍服務(wù),剩下空著的都給你盡量填上 , 歸類上屬于值初始化

    為什么歸類成值初始化?因為要負(fù)責(zé),必須得讓剩下的有個值。人家花括號都擺那了。

  2. 依然是空或者不夠的列表。類的話。默認(rèn)初始化本來就有個數(shù)(默認(rèn)構(gòu)造函數(shù)),你都有括號了,那就算作值初始化吧,好歹人家也有個值。

    內(nèi)置類型的話。按靜態(tài)或者全局的規(guī)矩來,給你值初始化一個數(shù)。

  3. 用空的()想要執(zhí)行默認(rèn)構(gòu)造函數(shù)是不對的,內(nèi)置類型和有些庫函數(shù)可以用空的()得到一個基礎(chǔ)值并且不報錯,是因為編譯器語法或者重載運(yùn)算符自己考慮到這方面,有相應(yīng)處理。


  1. 經(jīng)常提到(xxx)要取決與構(gòu)造函數(shù),這樣說可能有些模糊,舉幾個例子

    對于內(nèi)置類型,C++自己有自己的一套規(guī)定,單個變量,就按常理用。數(shù)組沒法用,new數(shù)組可以用,可能和指針有關(guān),不知道

    類的話不同的類不一樣,也即所謂構(gòu)造函數(shù)不一樣,比方說

    string str1(“yeats”)是對的,string str2('y')是錯的! 當(dāng)然,可以寫一個構(gòu)造函數(shù),形參是char,字符傳進(jìn)去再把它弄成字符串,但很多時候沒這樣


  1. 為什么 vector<string> v1("yeats")是錯誤的,而 vector<string> v2{"yeats"}正確?

vector是個模板,類模板還沒學(xué)到,暫時將其理解為待確定類型的數(shù)組。就像數(shù)組不能int a[10](7)一樣,()更多的是對你定義的這 個對象,整體進(jìn)行操作。{}才是主要面向有很多單一元素的容器或內(nèi)置數(shù)組中的元素,它把你的對象看作很多個小對象的組合,關(guān)注很多個小對象。如果你的變量沒有這種特性,那這個變量就是光桿司令,自己既是長官(對象)也是士兵(元素)。


  • 空: 什么情況都可以,算你定義了,默認(rèn)初始化,方式不同而已
  • () : 構(gòu)造函數(shù) 或 重載運(yùn)算符 ( 前者不可以空,后者可以)
  • {} : 正常同類 或 重載運(yùn)算符 (隨便空)
  • = : 正常拷貝初始化
  1. 如果你和我一樣是初學(xué)者,請敲碼測試!
    我的g++不知道為什么,動態(tài)局部內(nèi)置類型,也有初值,int是0
    如有錯誤或疏漏,感謝友情告知
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容