C++中變量進(jìn)行初始化的3種方法
1.用"=":copy initialization,這種初始化形式是從C繼承的。此種方式(拷貝初始化)的初始化在現(xiàn)代C+中已不再受歡迎,因?yàn)閷?duì)于某些復(fù)雜類型來(lái)說(shuō),此種方式初始化的效率低于其它形式的初始化。
每當(dāng)隱式拷貝或轉(zhuǎn)換值時(shí),也會(huì)使用拷貝初始化,例如按值將參數(shù)傳遞給函數(shù)、按值從函數(shù)返回或按值捕獲異常時(shí)。
2.構(gòu)造函數(shù)初始化:通過(guò)括號(hào)(parentheses)提供值來(lái)聲明變量。構(gòu)造函數(shù)初始化和舊的普通初始化方式(=)的區(qū)別在于,它總是返回括號(hào)中的最后一個(gè)值,無(wú)論它的大小或符號(hào)是什么。
direct initialization:就像拷貝初始化一樣,直接初始化在現(xiàn)代C++中已經(jīng)不再受歡迎,很大程度上是因?yàn)楸涣斜沓跏蓟〈?。然而,我們現(xiàn)在知道列表初始化有其自身的一些怪癖,因此直接初始化在某些情況下再次得到使用。
當(dāng)值顯式轉(zhuǎn)換為另一種類型時(shí),也會(huì)使用直接初始化。
直接初始化不受歡迎的原因之一是它使得很難區(qū)分變量和函數(shù):
int x(); // forward declaration of function x int x(0); // definition of variable x with initializer 0
3.統(tǒng)一初始化(list initialization or uniform initialization or brace initialization):C++中初始化對(duì)象的現(xiàn)代方法。用大括號(hào)代替括號(hào)(curly braces instead of parentheses)。與構(gòu)造函數(shù)初始化不同,此賦值方法只能采用大括號(hào)中的一個(gè)值,提供多個(gè)值將返回編譯錯(cuò)誤。
列表初始化還有一個(gè)額外的好處:列表初始化中的"縮小轉(zhuǎn)換(narrowing conversions,是隱式轉(zhuǎn)換)"格式不正確。這意味著,如果你嘗試使用變量無(wú)法安全保存的值來(lái)初始化變量,則編譯器需要生成診斷信息(通常是錯(cuò)誤)。
拷貝和直接初始化只會(huì)刪除小數(shù)部分,從而導(dǎo)致值初始化為可變寬度。你的編譯器可能會(huì)選擇性地警告你這一點(diǎn),因?yàn)楹苌傧M麃G失數(shù)據(jù)。但是,通過(guò)列表初始化,編譯器需要在這種情況下生成診斷。
你可以在通常進(jìn)行初始化的任何地方使用大括號(hào)初始化,例如,作為函數(shù)參數(shù)或返回值,或者與new關(guān)鍵字一起使用。
Value initialization and zero initialization: 當(dāng)使用空大括號(hào)初始化變量時(shí),將進(jìn)行值初始化。在大多數(shù)情況下,值初始化會(huì)將變量初始化為零(或空,如果這更適合給定類型)。在發(fā)生歸零的情況下,這稱為歸零初始化。
什么時(shí)候應(yīng)該使用{0}和{}進(jìn)行初始化:
(1).如果你實(shí)際使用該值,請(qǐng)使用顯式初始化值。
(2).如果值是臨時(shí)的并且將被替換,請(qǐng)使用值初始化。
優(yōu)先選擇直接列表初始化(或值初始化)來(lái)初始化變量。
以下為測(cè)試代碼,進(jìn)行了描述說(shuō)明
int test_variables_init() { int val; // no initializer(default initialization): 在大多數(shù)情況下,默認(rèn)初始化不執(zhí)行初始化,并且使變量具有不確定的值 // 1.using "=" int val1 = 1; // copy initialization: 這種初始化形式是從C繼承的 std::cout << "val1:" << val1 << "\n"; // val1:1 // 2.constructor initialization: parentheses int val2(2); // direct initialization std::cout << "val2:" << val2 << "\n"; // val2:2 int val3 = (3); std::cout << "val3:" << val3 << "\n"; // val3:3 // 構(gòu)造函數(shù)初始化和舊的普通初始化方式(=)的區(qū)別在于,它總是返回括號(hào)中的最后一個(gè)值,無(wú)論它的大小或符號(hào)是什么 int val4 = (4, 5, 6, 7, -8); std::cout << "val4:" << val4 << "\n"; // val4:-8 // 3.uniform initialization: curly braces int val5{ 9 }; // direct list initialization std::cout << "val5:" << val5 << "\n"; // val5:9 int val6 = { 10 }; // copy list initialization std::cout << "val6:" << val6 << "\n"; // val6:10 // 與構(gòu)造函數(shù)初始化不同,統(tǒng)一初始化方法只能采用大括號(hào)中的一個(gè)值,提供多個(gè)值將返回編譯錯(cuò)誤 //int val7 = { 11, 12 }; // error C2440: "初始化": 無(wú)法從"initializer list"轉(zhuǎn)換為"int" int val8{}; // value initialization int val12{ 0 }; // explicit initialization to value 0 std::cout << "val8:" << val8 << "\n"; // val8:0 // 列表初始化中的"縮小轉(zhuǎn)換(narrowing conversions)"格式不正確 //int val9{ 4.5 }; // error C2397: 從"double"轉(zhuǎn)換到"int"需要收縮轉(zhuǎn)換 int val10 = 4.5; // warning C4244: "初始化": 從"double"轉(zhuǎn)換到"int",可能丟失數(shù)據(jù) int val11(4.5); // warning C4244: "初始化": 從"double"轉(zhuǎn)換到"int",可能丟失數(shù)據(jù) return 0; }
執(zhí)行結(jié)果如下圖所示:
GitHub:https://github.com/fengbingchun/Messy_Test
到此這篇關(guān)于C++中變量進(jìn)行初始化的3種方法的文章就介紹到這了,更多相關(guān)C++ 變量進(jìn)行初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中用substr()函數(shù)消除前后空格的解決方法詳解
本篇文章是對(duì)C++中用substr()函數(shù)消除前后空格的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05c語(yǔ)言常量定義規(guī)則知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言常量定義規(guī)則知識(shí)點(diǎn)總結(jié),需要的朋友們可以學(xué)習(xí)下。2020-03-03使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用C++實(shí)現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果
這篇文章主要給大家介紹了關(guān)于如何為Qt視圖中的文字實(shí)現(xiàn)彩虹漸變效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03