
讀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)
-
除開靜態(tài)內(nèi)置安全方便起見,什么都不寫就執(zhí)行默認(rèn)初始化
只不過內(nèi)置類型默認(rèn)初始化就是不初始化,直接用地址上的原有數(shù)據(jù),效率高
類還有個默認(rèn)構(gòu)造函數(shù),效率低。
-
有 = 和()和 {} 這些符號。只要你這個類型支持,就屬于值初始化。關(guān)鍵是有一些不支持它為空!
那屬于什么?屬于ERROR!錯誤!
=不談,兩邊必須是一種東西,對于容器或內(nèi)置數(shù)組,右邊寫它的一個元素,如,int a[10]=2或者vector<string> v1="yeats",肯定錯
( )的話。用在類上空就錯!因為不寫才是默認(rèn)構(gòu)造!內(nèi)置類型和有些標(biāo)準(zhǔn)庫可以為空,不知道是什么騷操作。運(yùn)算符重載好像。
{} 列表好理解。就列表里面填它的同類或者元素。是個數(shù),里面就填數(shù),是個數(shù)組,里面依然填數(shù)。用列表只是為了方便一堆一樣的類型, 一起給你填進(jìn)去。
-
列表元素只有一個?甚至就只有個括號?沒關(guān)系 ,用了列表就是一條龍服務(wù),剩下空著的都給你盡量填上 , 歸類上屬于值初始化
為什么歸類成值初始化?因為要負(fù)責(zé),必須得讓剩下的有個值。人家花括號都擺那了。
-
依然是空或者不夠的列表。類的話。默認(rèn)初始化本來就有個數(shù)(默認(rèn)構(gòu)造函數(shù)),你都有括號了,那就算作值初始化吧,好歹人家也有個值。
內(nèi)置類型的話。按靜態(tài)或者全局的規(guī)矩來,給你值初始化一個數(shù)。
用空的()想要執(zhí)行默認(rèn)構(gòu)造函數(shù)是不對的,內(nèi)置類型和有些庫函數(shù)可以用空的()得到一個基礎(chǔ)值并且不報錯,是因為編譯器語法或者重載運(yùn)算符自己考慮到這方面,有相應(yīng)處理。
-
經(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)去再把它弄成字符串,但很多時候沒這樣
- 為什么
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)算符 (隨便空)
- = : 正常拷貝初始化
- 如果你和我一樣是初學(xué)者,請敲碼測試!
我的g++不知道為什么,動態(tài)局部內(nèi)置類型,也有初值,int是0
如有錯誤或疏漏,感謝友情告知