C11的新特性
1.類型推導
auto定義的變量可以根據初始化的值,在編譯是推導出變量名的類型。
并不能代表一個實際的類型聲明,只是一個類型聲明的“占位符”。
使用auto聲明的變量必須有初始化值,方便編譯器推斷出它的實際類型
,并在編譯時替換成真正的數據類型。
兩條規則:
1)當不聲明為指針或引用時,auto的推導結果和初始化表達式拋棄引用和cv限定符后類型一致。
2)當聲明為指針或引用時,auto的推導結果將保持初始化表達式的cv屬性。
總結:
1、C11中auto成為類型指示符(type-specifier)。
2、auto不能用于函數參數。
3、auto不能用于非靜態成員變量
4、auto無法定義數組
5、實例化模板時不能使用auto作為模板參數。
2.decltype關鍵字
從格式上來看,decltype 很像sizeof-—用來推導表達式類型大小的操作符。類似于sizeof,decltype 的推導過程是在編譯期完成的,并且不會真正計算表達式的值。
例:
int main(){int x = 10;decltype(x)y = 1;// y => int decltype(x+y) Z= 0;// y = int;const int &i= x;decltype(i)j= y; //j= const int &;const decltype(z)*p= &z;// *p=> const int,p= const int*decltype(z)*ip= &z;//*ip=> int,ip=>int*decltype(pi)*pp = &ip // *pp => int *,pp → int;}3.基于范圍的for循環
以下是基于范圍的for循環的一般格式:
for(ElemType val:array) ? { ? ...// statement 循環體 ? }ElemType∶是范圍變量的數據類型。它必須與數組(容器元素的數據類型一樣,或者是數組元素可以自動轉換過來的類型。
val∶是范圍變量的名稱。該變量將在循環迭代期間依次接收數組中的元素值。在第一次循環迭代期間,它接收的是第一個元素的值;在第二次循環迭代期間,它接收的是第二個元素的值;以此類推。
array∶是要讓該循環進行處理的數組(容器)的名稱。該循環將對數組中的每個元素迭代一次。
statement∶是在每次循環迭代期間要執行的語句。要在循環中執行更多的語句,則可以使用一組大括號來包圍多個語句。與其他循環體一樣,可以用continue來結束本次循環,也可以用break來跳出整個循環。
4.指針空值——nullptr
nullptr是有類型的,且僅可以被隱式轉換為指針類型
nullptr和 nullptr_t
C11標準不僅定義了指針空值常量 nullptr,也定義了其指針空值類型 nullptr_t,也就表示了指針空值類型并非僅有 nullptr一個實例。通常情況下,也可以通過nullptr t來聲明—個指針空值類型的變量(即使看起來用途不大)。
除去 nullptr及 nullptr t以外,C++中還存在各種內置類型。C++11標準嚴格規定了數據間的關系。大體上常見的規則簡單地列在了下面∶
所有定義為 nullptr_t類型的數據都是等價的,行為也是完全一致。
nullptr_t類型數據可以隱式轉換成任意一個指針類型。nullptr_t類型數據不能轉換為非指針類型,即使使用的方式也是不可以的
reinterpret_cast<nullptr_t>O); ? int main() ? { ? int a= nullptr;// error; ? int *p= nullptr; // ok; ? char *cp= nullptr; // ok; ? }nullptr_t類型數據不適用于算術運算表達式。
nullptr_t類型數據可以用于關系運算表達式,但僅能與nullptr t類型數據或者指針類型數據進行較,當且僅當關系運算符為=、<=、>=等時返回 true。
注意∶
1、nullptr 是C11新引入的關鍵字,是一個所謂"指針空值類型"的常量,在C++程序中直接使用。
2、在C11中,sizeof(nullptr)與sizeof(void*)0)所占的字節數相同都(4,或8)。
3、為了提高代碼的健壯性,在后續表示指針空值時建議最好使用nullptr。
5.typedef與using
typedef unsigned int uint; ? using uint = unsigned int; ? ? ? template<class__Ty> ? using pointer = _Ty *; ? int main() ? { ? int x = 10; ? double dx = 12.25; ? pointer<int>ip=&x; ? pointer<double> dp = &dx; ? return 0; } ?指針類型:
野指針:int *p;
空指針:int *sp=nullptr;
失效指針:sp=new int(10); delete sp;//變成失效指針
總結
- 上一篇: 计算机考研408考试科目及备考指南
- 下一篇: k8s 组件介绍-API Server