【C++ grammar】Enhancement for Type System (C++11 对类型系统的增强)
數(shù)據(jù)類型 (Data type)
int, long int, double, struct, char *, float [], int (*f)()…
計算機程序構(gòu)造塊
計算機程序構(gòu)造塊是不同大小粒度的計算機程序組成部分,它包括變量、表達式、函數(shù)或者模塊等。
類型系統(tǒng) (Type System)
類型系統(tǒng):在編程語言中,“類型系統(tǒng)”是將“type”屬性指定給不同計算機程序構(gòu)造塊的規(guī)則集
為什么使用類型系統(tǒng):減少程序中可能出現(xiàn)的bug
1、定義不同程序塊之間的接口
2、檢查多個塊之間是否以一致的方式連接在一起
類型系統(tǒng)分為:靜態(tài)類型和動態(tài)類型
類型系統(tǒng)存在于我們編寫程序中,編譯器會幫我們檢查類型系統(tǒng)。
如果檢查發(fā)生在編譯期(編譯的時候檢查類型系統(tǒng)是否一致),稱為靜態(tài)類型
如果檢查發(fā)生在運行期(執(zhí)行的時候檢查類型系統(tǒng)是否一致),稱為動態(tài)類型
如果檢查同時存在與編譯期間和運行期間,稱為混合類型
C、C++、Java是靜態(tài)類型
Python是動態(tài)類型
Automatic Type Deduction: auto (C++11) 自動類型推導(dǎo):auto關(guān)鍵字
C++03及之前的標準種,auto放在變量聲明之前,聲明變量的存儲策略。但是這個關(guān)鍵字常省略不寫。
C++11中,auto關(guān)鍵字放在變量之前,作用是在聲明變量的時候根據(jù)變量初始值的類型自動為此變量選擇匹配的類型
例:
result:
int
注意點:
1、auto 變量必須在定義時初始化,這類似于const關(guān)鍵字
2、定義在一個auto序列的變量必須始終推導(dǎo)成同一類型
auto a4 = 10, a5{20}; //正確 auto b4{10}, b5 = 20.0; //錯誤,沒有推導(dǎo)為同一類型3、如果初始化表達式是引用或const,則去除引用或const語義。
int a{10}; int &b = a; auto c = b; //c的類型為int而非int&(去除引用) const int a1{10}; auto b1 = a1; //b1的類型為int而非const int(去除const)4、如果auto關(guān)鍵字帶上&號,則不去除引用或const語意
int a = 10; int& b = a; auto& d = b;//此時d的類型才為int& const int a2 = 10; auto& b2 = a2;//因為auto帶上&,故不去除const,b2類型為const in5、初始化表達式為數(shù)組時,auto關(guān)鍵字推導(dǎo)類型為指針
int a3[3] = { 1, 2, 3 }; auto b3 = a3; cout << typeid(b3).name() << endl; //輸出int * (輸出與編譯器有關(guān))6、若表達式為數(shù)組且auto帶上&,則推導(dǎo)類型為數(shù)組類型
int a7[3] = { 1, 2, 3 }; auto& b7 = a7; cout << typeid(b7).name() << endl; //輸出int [3] (輸出與編譯器有關(guān))7、C++14中,auto可以作為函數(shù)的返回值類型和參數(shù)類型
auto max(int x , int y) {return x>y?x:y; }我們在使用auto時有時會遇到一些特殊情況。
1、 “int x = 3;” 能變成auto形式嗎?
當我們非常希望能夠在變量定義的時候,【明確】地指出變量的類型,而且不希望隨便更改其類型,那么我們可以使用下面的方法:
2、 auto和初始化列表一起用 要避免在一行中使用直接列表初始化和拷貝列表初始化,也就是,下面的代碼是有問題的:
auto x { 1 }, y = { 2 }; // 不要同時使用直接和拷貝列表初始化
“AAA原則”:總是使用auto!
問題:能用auto聲明C風(fēng)格的數(shù)組嗎?
如果你嘗試讓C++11編譯器編譯如下代碼,它會報錯
auto 不能用于聲明數(shù)組,否則無法通過編譯,報auto類型不能出現(xiàn)在頂級數(shù)組類型中。
也就是說auto只能是指針指向數(shù)組的而不能去聲明一個數(shù)組。
自動類型推導(dǎo):decltype關(guān)鍵字
1、關(guān)鍵字decltype的用法
decltype利用已知類型聲明新變量。
有了auto,為什么還要整出一個decltype?原因是,我們有時候想要從表達式的類型推斷出要定義的變量類型,但不想用該表達式的值初始化變量。
decltype是在編譯期推導(dǎo)一個表達式的類型,而不用初始化,其語法格式有點像sizeof。它只做靜態(tài)分析,因此它不會導(dǎo)致已知類型表達式執(zhí)行。
decltype 主要用于泛型編程(模板)
2、代碼示例
我們可以發(fā)現(xiàn),我們將fun2的‘g’改變,例如改成4,y類型也改了。
這樣我們修改了返回值類型,程序仍然能夠正常運行。
這說明,使用類型推導(dǎo)是有好處的。
3、decltype與auto的對比
decltype和auto都是C++11自動類型推導(dǎo)的關(guān)鍵字。它們有很多差別:
auto忽略最上層的const,decltype則保留最上層的const
auto忽略原有類型的引用,decltype則保留原有類型的引用
對解引用操作,auto推斷出原有類型,decltype推斷出引用
4、auto推斷時會實際執(zhí)行,decltype不會執(zhí)行,只做分析。
總之在使用中過程中和const、引用和指針結(jié)合時需要特別小心。
小結(jié)
C++11對C++03的增強,或者說C++11的“Modern”的特點之一就是由auto和decltype構(gòu)成的自動類型推導(dǎo)系統(tǒng)。
但是,auto與初始化列表結(jié)合,又有一些坑。你在寫代碼時如果經(jīng)常將auto與列表初始化一起使用,那么會遇到一些問題。本節(jié)只介紹auto的常見用法。auto與初始化列表結(jié)合的坑,得由你自己去踩了。
為了說明auto有多么復(fù)雜,這里摘取 https://cppreference.com 網(wǎng)站列出的auto的語法格式:
總結(jié)
以上是生活随笔為你收集整理的【C++ grammar】Enhancement for Type System (C++11 对类型系统的增强)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀如何输入编码替换阵容
- 下一篇: 光与夜之恋配音怎么切换