C++中變量進行初始化的3種方法
1.用"=":copy initialization,這種初始化形式是從C繼承的。此種方式(拷貝初始化)的初始化在現(xiàn)代C+中已不再受歡迎,因為對于某些復(fù)雜類型來說,此種方式初始化的效率低于其它形式的初始化。
每當(dāng)隱式拷貝或轉(zhuǎn)換值時,也會使用拷貝初始化,例如按值將參數(shù)傳遞給函數(shù)、按值從函數(shù)返回或按值捕獲異常時。
2.構(gòu)造函數(shù)初始化:通過括號(parentheses)提供值來聲明變量。構(gòu)造函數(shù)初始化和舊的普通初始化方式(=)的區(qū)別在于,它總是返回括號中的最后一個值,無論它的大小或符號是什么。
direct initialization:就像拷貝初始化一樣,直接初始化在現(xiàn)代C++中已經(jīng)不再受歡迎,很大程度上是因為被列表初始化所取代。然而,我們現(xiàn)在知道列表初始化有其自身的一些怪癖,因此直接初始化在某些情況下再次得到使用。
當(dāng)值顯式轉(zhuǎn)換為另一種類型時,也會使用直接初始化。
直接初始化不受歡迎的原因之一是它使得很難區(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++中初始化對象的現(xiàn)代方法。用大括號代替括號(curly braces instead of parentheses)。與構(gòu)造函數(shù)初始化不同,此賦值方法只能采用大括號中的一個值,提供多個值將返回編譯錯誤。
列表初始化還有一個額外的好處:列表初始化中的"縮小轉(zhuǎn)換(narrowing conversions,是隱式轉(zhuǎn)換)"格式不正確。這意味著,如果你嘗試使用變量無法安全保存的值來初始化變量,則編譯器需要生成診斷信息(通常是錯誤)。
拷貝和直接初始化只會刪除小數(shù)部分,從而導(dǎo)致值初始化為可變寬度。你的編譯器可能會選擇性地警告你這一點,因為很少希望丟失數(shù)據(jù)。但是,通過列表初始化,編譯器需要在這種情況下生成診斷。
你可以在通常進行初始化的任何地方使用大括號初始化,例如,作為函數(shù)參數(shù)或返回值,或者與new關(guān)鍵字一起使用。
Value initialization and zero initialization: 當(dāng)使用空大括號初始化變量時,將進行值初始化。在大多數(shù)情況下,值初始化會將變量初始化為零(或空,如果這更適合給定類型)。在發(fā)生歸零的情況下,這稱為歸零初始化。
什么時候應(yīng)該使用{0}和{}進行初始化:
(1).如果你實際使用該值,請使用顯式初始化值。
(2).如果值是臨時的并且將被替換,請使用值初始化。
優(yōu)先選擇直接列表初始化(或值初始化)來初始化變量。
以下為測試代碼,進行了描述說明
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ū)別在于,它總是返回括號中的最后一個值,無論它的大小或符號是什么 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)一初始化方法只能采用大括號中的一個值,提供多個值將返回編譯錯誤 //int val7 = { 11, 12 }; // error C2440: "初始化": 無法從"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++中變量進行初始化的3種方法的文章就介紹到這了,更多相關(guān)C++ 變量進行初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中用substr()函數(shù)消除前后空格的解決方法詳解
本篇文章是對C++中用substr()函數(shù)消除前后空格的方法進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06