在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程式設計的人大概可以猜出自動型別推斷是做什麼用的了 幫你...