Cocos 3.x 用了大量的C++ 11 的東西,所以作為一個C++忠實粉絲,有必要對C++ 11進行一個系統的學習。
使用C++11之前,一定要注意自己使用的編譯器對C++11的支持情況,有些編譯器並不是完全支持,比如我正在使用的vs2012。這里是msdn里面VS各版本對C++ 11 的支持 對 C++11 功能的支持(現代 C++)
1.auto
auto這個關鍵字C++原先就有,用來指定存儲器。因為很少有人去用這個東西,所以在C++11中就把原有的auto功能給廢棄掉了,而變成了現在的類型推導關鍵字。先說下auto的簡單用法:
#include <iostream> #include <vector> #include <map> using namespace std; int main() { auto num = 1; //num 是int類型 auto c = 'A'; //c 是char類型 auto str("test"); // str是char數組 map<string, vector<int>> map; for(auto it = begin(map); it != end(map); ++it) // it 為迭代器類型 { } return 0; }
這樣使用最明顯的好處就是在使用迭代器遍歷STL容器的時候,不用去聲明那些迭代器的類型,也不用去使用typedef就能很簡潔的實現遍歷了。
從效率上來說,auto不會對運行時效率產生影響,它是在編譯的時候推導類型的,例如上面的代碼,編譯的時候,就會把num變量轉換為int類型。
auto和其他變量類型有明顯的區別:
1.auto聲明的變量必須要初始化,否則編譯器不能判斷變量的類型。
2.auto不能被聲明為返回值,auto不能作為形參,auto不能被修飾為模板參數
3.
2.decltype
decltype關鍵字和auto相互對應的,它們經常在一些場所配合使用。decltype可以在編譯的時候判斷出一個變量或者表達式的類型,例如:
#include <iostream> #include <vector> #include <map> using namespace std; void func(auto can) { int a; } int main() { auto num = 1; //num 是int類型 decltype(num) num2 = num; //num2 也是int類型 return 0; }
這里decltype拿到了num的類型,然后用這個類型定義了num2做了num的一份copy。auto和decltype還有一種經典的使用場合,看下面例子:
template <typename T1, typename T2> auto compose(T1 t1, T2 t2) -> decltype(t1 + t2) { return t1+t2; }
這里是用一個模板來計算兩個變量的加法,如果兩個類型T1和T2不一樣的話,t1+t2的類型將由編譯器來決定,這樣使用decltype就可以拿到返回的類型。但是如果把decltype(t1 + t2)放到函數命名的前面作為返回值的話,按照編譯器的解析順序,當解析到返回值decltype(t1 + t2)的時候t1和t2還沒有被定義,所以要重新聲明t1和t2的類型,這樣就會變的很復雜很難讀懂。
於是C++11就改變了語法規則,把decltype(t1 + t2)放到函數的后方,並用auto作為返回值來告訴編譯器,真正的返回值在函數聲明之后。簡單的說auto可以作為返回值占位符來使返回值后置。