C++ 11特性
阿新 • • 發佈:2018-09-17
erro 匹配 編譯速度 void con 函數對象 roc _each 文件
1.auto:自動類型推導
編譯時對變量進行類型推導,不會對程序的運行效率造成影響;
不會影響編譯速度,因為編譯時也要右側推導,然後判斷與左側是否匹配;
通過初始化表達式進行類型推導。
1. auto a; // error 如果沒有初始化表達式,就無法確定a的類型 2. auto i = 1; 3. auto d = 1.0; 4. auto str = "hello world"; 5. auto ch = ‘a‘; 6. auto func = less<int>(); 7. vector<int> iv; auto ite = iv.begin(); 8. auto p = new foo(); // 對自定義類型進行類型推導 9. 模板中應用: template <typename Product, typename Creator> void processProduct(const Creator& creator) { Product* val = creator.makeObject(); } // 使用auto templete <typename Creator> voidprocessProduct(const Creator& creator) { auto val = creator.makeObject(); }
2. decltype:從一個變量或表達式中得到類型
int x = 3; decltype(x)y = x; // 應用 template <typename Creator> auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) { auto val = creator.makeObject() }
3. nullptr:空指針常量
#ifdef __cplusplus ---簡稱:cpp c++ 文件 #define NULL 0 #else #define NULL ((void *)0) #endi
解決C++中NULL的二義性,因為NULL實際上代表0;
C++中不能將void *類型的指針隱式轉換成其他指針類型。
4. 序列for循環
遍歷數組、容器、string以及由begin和end函數定義的序列(即有Iterator)
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}}; for(auto p : m) { cout<<p.first<<":"<<p.second<<endl; }
5. Lambda表達式
創建並定義匿名的函數對象,簡化編程。
// 語法 // [函數對象參數](操作符重載函數參數)->返回值類型{函數體} vector<int> iv{5, 4, 3, 2, 1}; int a = 2, b = 1; for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x+b)<<endl;}); // (1) for_each(iv.begin(), iv.end(), [=](int &x){x *= (a+b);}); // (2) for_each(iv.begin(), iv.end(), [=](int &x)->int{return x*(a+b);}); // (3)
[]:可取得的全局變量
(1):b指函數可得到在Lambda表達式外的全局變量
(2)(3):=是可取得所有的外部變量
():每次調用函數時傳入的參數
->後加上的是Lambda表達式返回值的類型
6. 變長參數的模板
// pair可使用make_pair構造 auto p = make_pair(1, "C++ 11"); // 變長參數模板,tuple(1個N元組) auto t1 = make_tuple(1, 2.0, "C++ 11"); auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2}); // Print函數 template<typename head, typename... tail> void Print(Head head, typename... tail) { cout<<head<<endl; Print(tail...); } // Print中可傳入多個不同種類的參數 Print(1, 1.0, "C++ 11");
7. 智能指針
C++11之後智能指針分為了三種:shared_ptr, unique_ptr, weak_ptr
C++11之後的智能指針的構造函數都有explict關鍵詞修飾,表明它不能被隱式的類型轉換。
shared_ptr<int> p1 = new int(1024); //這種是不行的,因為等號右邊是一個int*的指針,因為有explict修飾,所以它不能被隱式的轉換為shared_ptr<int>的類型 shared_ptr<int> p2(new int(1024)); //這種是直接采用了初始化的形式
C++ 11特性