C 11新標準之四 型別處理

2021-07-29 14:58:14 字數 2618 閱讀 5876

在c++11之前,如果定義型別別名使用 typedef 方式來定義,定義的方式如下:

[cpp]view plain

copy

//typedef  型別名  別名

typedef

double

salary;  

typedef

double

*base; 

//base是double* 型別

這種定義方式有點類似與定義乙個變數的方式,只是定義的標示符不是變數名而是型別名

這種定義方式有乙個缺點,當在定義如指標等復合型別,特別是加入const標示符之後,使得定義變得難於理解,如:

[cpp]view plain

copy

typedef

char

*pstring;  

const

pstring cstr = 0; 

// cstr是乙個自身是const型別的指標,指標指向的型別是char型別的變數

const

pstring *ps; 

// ps 是乙個指標的指標,它指向const型別的指標,這個const型別的指標指向的型別是char型別的變數

auto關鍵字用於型別的推導,可以簡化我們去寫大段的型別定義(特別是容器中的迭代器),auto使用中需要初始化才能進行推導,如:

[cpp]view plain

copy

intval1=0, val2=1;  

auto item = val1+val2; // item是int型別

std::vectorsvec;  

for(std::vector::iterator iter = svec.begin(); iter != svec.end(); ++iter)  

可以簡寫為  

for(auto iter = svec.begin(); ...)  

使用auto時,當推導復合型別以及const修飾符的時候需要注意:

1. 當在引用中推導時,auto代表該引用實際繫結物件的型別,如:

[cpp]view plain

copy

inti = 0;  

int&r = i;  

auto a = r; //a是int型別,因為r繫結的型別是int

2. auto在推導中會忽略頂層const(top-level const),但是底層const(low-level const)會被保留

[cpp]view plain

copy

inti = 0;  

const

intci = i, &cr = ci;  

auto b = ci; // b是int型別 (頂層const被忽略)

auto c = cr; // c 是int型別

auto d = &i; // d是int*型別

auto e = &ci; // e 是const int*型別(&ci得到的型別是指向const int型別的指標,是底層const)

如果我們想保留頂層的const,那麼我們需要顯示地宣告,如:

[cpp]view plain

copy

const

intci = 10;  

const

auto f = ci; 

// f是const int型別

由於引用不是物件,因此引用中的const都是low-level const,在auto推導型別的時候會被保留:

[cpp]view plain

copy

const

intci = 10;  

auto &g = ci; // g 是const int&型別

有時候我們不需要用乙個表示式來初始化乙個變數,而只是想知道這個表示式最終得到的是什麼型別的變數,這時候我們可以使用decltype關鍵字:

decltypde推導型別與auto有一些不同:

1. decltype會保留頂層的const

2.decltype會保留引用

[cpp]view plain

copy

const

intci = 0, &cj = ci;  

decltype(ci) x = 0; // x 是const int型別(top-level const得到保留)

decltype(cj) y = x; // y 是const int& 型別

另外關於decltype還需要注意的地方:

[cpp]view plain

copy

當decltype((變數名))這時候得到的是乙個引用的型別,但是decltype(變數名)只有當變數型別是引用型別的時候,才得到引用的型別.  

如:  

inti = 1;  

decltypde((i)) d; //d是int& 型別

decltypde(i) e;   //e是int型別

C 11新標準之五 constexpr

常量表示式必須在編譯期間計算出它的值並且 它的值不可以被改變。在c 11中,我們可以通過宣告constexpr讓編譯器確定乙個變數是不是常量表示式,宣告為constexpr的變數是const型別的變數,它必須由常量表示式來初始化。例如 cpp view plain copy constexpr in...

C 11新標準之範圍for語句

說起for語句,我們都不會陌生,因為在迴圈中經常會用for語句來遍歷一些陣列什麼的,就形如以下的for迴圈,是我們最常見的 for int i 0 i 5 i 範圍for語句可以遍歷容器或者其他序列的所有元素。以下用乙個小小的 測試片段說明一下這個新特性的使用方法 傳統寫法,遍歷每個string型別...

c 11 型別推斷

當編譯器能夠在乙個變數的宣告時候就推斷出它的型別,那麼你就能夠用auto關鍵字來作為他們的型別 cpp view plain copy auto x 1 編譯器當然知道x是integer型別的。所以你就不用int了。接觸過泛型程式設計或者api程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你...