部門網(wǎng)站建設(shè)個(gè)人總結(jié)國外搜索引擎排名
前言:
C++11
是C++
編程語言的一個(gè)重要版本,于2011
年發(fā)布。它帶來了數(shù)量可觀的變化,包含約140
個(gè)新特性,以及對(duì)C++03
標(biāo)準(zhǔn)中約600
個(gè)缺陷的修正,更像是從C++98/03
中孕育出的新語言
列表初始化
C++11
中的列表初始化(List Initialization)
是一種新的初始化語法,它提供了更統(tǒng)一、更靈活和更安全的初始化方式。以下是關(guān)于 C++11 列表初始化的詳細(xì)介紹
基本語法
可以直接在變量名后面加上初始化列表來進(jìn)行對(duì)象的初始化。
int x = {10}; // 初始化一個(gè)整數(shù)變量 x 為 10
int arr[] = {1, 2, 3}; // 初始化一個(gè)整數(shù)數(shù)組 arr
std::vector<int> v = {4, 5, 6}; // 初始化一個(gè) std::vector 容器
適用范圍
- **內(nèi)置類型:**可用于所有內(nèi)置類型,如整數(shù)、浮點(diǎn)數(shù)、字符等。
- **自定義類型:**對(duì)于自定義的類或結(jié)構(gòu)體,如果滿足聚合類型的條件,也可以使用列表初始化。如果類定義了合適的構(gòu)造函數(shù)(包括接受 std::initializer_list 類型參數(shù)的構(gòu)造函數(shù)),同樣可以使用列表初始化
聚合類型的條件
在 C++11 中,聚合類型需要滿足以下條件1:
- 類型是一個(gè)普通數(shù)組:如
int[5]
,char[]
,double[3]
等。 - 類型是一個(gè)類,且滿足以下條件:
- 沒有用戶聲明的構(gòu)造函數(shù)。
- 沒有用戶提供的構(gòu)造函數(shù)(允許顯示預(yù)置或棄置的構(gòu)造函數(shù))。
- 沒有私有或保護(hù)的非靜態(tài)數(shù)據(jù)成員。
- 沒有基類。
- 沒有虛函數(shù)。
- 沒有
{}
和=
直接初始化的非靜態(tài)數(shù)據(jù)成員。 - 沒有默認(rèn)成員初始化器
initializer_list
initializer_list
是 C++11
引入的一種模板類,用于表示某種類型的對(duì)象的列表。它提供了一種方便的方式來處理和傳遞一組相同類型的值,類似于其他語言中的列表或數(shù)組。以下是關(guān)于 initializer_list
的一些重要特點(diǎn)和用法:
-
創(chuàng)建和初始化:
- 可以使用花括號(hào)
{}
來創(chuàng)建一個(gè)std::initializer_list
對(duì)象,并在其中列出要包含的元素。例如:std::initializer_list<int> myList = {1, 2, 3, 4, 5};
。 - 元素的類型必須相同,否則會(huì)導(dǎo)致編譯錯(cuò)誤。不過,編譯器會(huì)進(jìn)行一些隱式的類型轉(zhuǎn)換,例如將
int
類型的元素轉(zhuǎn)換為double
類型的列表是允許的,但可能會(huì)有精度損失。例如:std::initializer_list<double> doubleList = {1, 2, 3};
這里1
、2
、3
會(huì)被隱式轉(zhuǎn)換為1.0
、2.0
、3.0
。 - 不允許進(jìn)行縮窄轉(zhuǎn)換,即會(huì)導(dǎo)致數(shù)據(jù)丟失或精度降低的轉(zhuǎn)換是不被允許的。例如:
std::initializer_list<char> charList = {1000};
會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)?1000
超出了char
類型的取值范圍。
- 可以使用花括號(hào)
-
常見用法:
- 初始化容器:可以方便地用于初始化標(biāo)準(zhǔn)庫中的容器,如
std::vector
、std::list
等。例如:std::vector<int> vec = {1, 2, 3};
。 - 函數(shù)參數(shù):函數(shù)可以接受
std::initializer_list
作為參數(shù),從而可以接收任意數(shù)量的同類型參數(shù)。例如:
void printValues(std::initializer_list<int> values) {for (auto value : values) {std::cout << value << " ";}std::cout << std::endl; }int main() {printValues({1, 2, 3, 4, 5});return 0; }
- 類的構(gòu)造函數(shù):在類的構(gòu)造函數(shù)中使用 std::initializer_list,可以方便地實(shí)現(xiàn)多種初始化方式。例如:
- 初始化容器:可以方便地用于初始化標(biāo)準(zhǔn)庫中的容器,如
auto
在 C++11
中,auto
是一個(gè)用于自動(dòng)類型推導(dǎo)的關(guān)鍵字。它可以讓編譯器根據(jù)初始化表達(dá)式的類型自動(dòng)推斷變量的類型,從而簡化代碼的編寫,提高代碼的可讀性和可維護(hù)性1。以下是關(guān)于 auto 的一些重要特點(diǎn)和用法:
- 基本用法:在定義變量時(shí),使用
auto
關(guān)鍵字,編譯器會(huì)根據(jù)初始化的值來推斷變量的類型。例如:
auto x = 5; // x 的類型為 int
auto y = 3.14; // y 的類型為 double
auto z = "hello, world!"; // z 的類型為 const char*
與指針和引用結(jié)合:
auto
可以與指針結(jié)合使用,用于自動(dòng)推導(dǎo)指針類型。例如:
int num = 10;
auto ptr = # // ptr 的類型為 int*
- 用于函數(shù)返回值類型推導(dǎo)(C++14):在 C++14 標(biāo)準(zhǔn)中,可以使用
auto
關(guān)鍵字結(jié)合->
運(yùn)算符來推導(dǎo)函數(shù)的返回值類型。例如:
auto add(int a, int b) -> int {return a + b; // 返回 a 和 b 的和
}
- 在范圍
for
循環(huán)中的應(yīng)用(C++11):C++11 引入的范圍for
循環(huán)結(jié)合auto
關(guān)鍵字,可以更方便地遍歷容器。例如:
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (auto number : numbers) {std::cout << number << std::endl; // 輸出每個(gè)元素
}
優(yōu)點(diǎn)
- 簡化代碼:避免了手動(dòng)指定復(fù)雜的類型,尤其是對(duì)于模板庫中復(fù)雜的迭代器類型等,使用
auto
可以大大簡化代碼的書寫1。 - 提高可讀性:使代碼更加清晰易讀,減少了類型聲明帶來的視覺干擾,讓開發(fā)者更關(guān)注于代碼的邏輯而不是類型的細(xì)節(jié)1。
- 靈活性:在類型需要改變時(shí),只需要修改初始化表達(dá)式的類型,而使用
auto
定義的變量的類型會(huì)自動(dòng)隨之改變,減少了代碼修改的工作量。
decltype
基本語法
decltype(expression) variable_name;
expression
:用于推導(dǎo)類型的表達(dá)式。variable_name
:根據(jù)推導(dǎo)出的類型聲明的變量名。
使用場景
-
推導(dǎo)變量的類型
通過decltype
,你可以推導(dǎo)一個(gè)已有變量的類型:int a = 5; decltype(a) b = 10; // b的類型是int,和a相同
-
推導(dǎo)表達(dá)式的類型
decltype
也可以用于推導(dǎo)更復(fù)雜的表達(dá)式的類型:int x = 10; decltype(x + 1.0) y; // y的類型是double,因?yàn)閤+1.0的結(jié)果是double
-
用于函數(shù)返回類型
在C++11中,你可以通過decltype
根據(jù)函數(shù)內(nèi)部表達(dá)式來指定返回類型:template<typename T1, typename T2> auto add(T1 a, T2 b) -> decltype(a + b) {return a + b; }
這里,
decltype(a + b)
將推導(dǎo)出a + b
的類型,并用作返回類型。 -
在lambda表達(dá)式中使用
在C++11中,你可以在lambda表達(dá)式中使用decltype
推導(dǎo)捕獲變量或返回值的類型:auto lambda = [](int x, int y) -> decltype(x + y) {return x + y; };
decltype與auto的區(qū)別
auto
用于根據(jù)初始化表達(dá)式推導(dǎo)變量類型。decltype
不需要初始化,直接根據(jù)表達(dá)式推導(dǎo)類型,可以用于聲明變量、函數(shù)返回類型等。
例如:
int a = 5;
auto b = a; // auto推導(dǎo)b為int
decltype(a) c; // decltype推導(dǎo)c為int,但c未初始化
用于根據(jù)初始化表達(dá)式推導(dǎo)變量類型。
decltype
不需要初始化,直接根據(jù)表達(dá)式推導(dǎo)類型,可以用于聲明變量、函數(shù)返回類型等。
例如:
int a = 5;
auto b = a; // auto推導(dǎo)b為int
decltype(a) c; // decltype推導(dǎo)c為int,但c未初始化
decltype
可以在編譯時(shí)推導(dǎo)任意表達(dá)式的類型,因此在模板和泛型編程中,decltype
是一個(gè)強(qiáng)大的工具。