C++ 11 新特性
C++ 11 新特性
類內成員賦初值
類內數據成員允許賦默認值。
C11以前是會報錯的。ISO C++ forbids initialization of member `name_var_'
lambda表達式
lambda表達式本質上是一個未命名的內聯函數。
很多語言都提供了 lambda 表達式,如 Python,Java 8。lambda 表達式可以方便地構造匿名函數,如果你的代碼裏麵存在大量的小函數,而這些函數一般隻被調用一次,那麼不妨將他們重構成 lambda 表達式,簡化編程。
lambda 格式:[capture list](parameter list)->return type {function body}
我們可以忽略參數列表和返回類型,但必須永遠包含捕獲列表和函數體。
regex
regex
random
C98中,通過rand()函數生成隨機數。C 11使用 default_random_engine 類 和 相應的分布類。
智能指針
cpp中,動態內存的管理是通過new、delete這一對操作實現的。delete操作的時機很難正確的把握,所以c11引入了智能指針,smart pointer,本質是模板類。
shared_ptr允許多個指針指向同一個對象。
unique_ptr獨占所指的對象。
最安全的分配和使用動態內存的方法是調用make_shared庫函數,它負責在堆中申請動態對象並返回智能指針。
每個智能指針都自動的維護著一個引用計數,若減為0,則自動調用對象的析構函數釋放內存,不需程序員進行delete操作。當指向一個對象的最後一個shared_ptr銷毀時,該對象也會被銷毀。
shared/unique _ptr二者都支持的操作 | |
shared_ptr<T> p或 unique_ptr<T> p | 空智能指針,可以指向類型為T的對象 |
p | 若p指向一個對象,p為true,可用於if(p)判斷 |
*p | 解引用p,獲得它指向的對象,類似普通指針 |
p->member_object | 等價於(*p).member_object |
p.get() | 返回p中保存的指針。要小心使用,若智能指針釋放了對象,返回的指針所指的對象就也消失了 |
shared_ptr 獨有的操作 | |
make_shared<T>(args) | 根據args參數創建T類型動態對象,然後返回shared_ptr 對象 |
shared_ptr<T> p(q) | p是q的拷貝;此操作會遞增q中的計數器。初始化要求類型兼容。 |
p=q | p的引用計數減一,q的引用計數加一 |
p.use_count() | 返回與p共享對象的智能指針數量 |
p.unique() | 若p.use_count()為1,返回true,否則是false。 |
範圍for
更簡單的for語句,用於遍曆序列或容器的元素,並執行特定操作。
語法為 for(declaration:expression) statement 即for(變量:序列) 語句
大括號賦值
c11允許使用大括號括起來的初始值列表給對象賦值。
vector<int> v;v={1,1,2};
這在c11以前是錯誤的。
委托構造函數
隻是新特性,不涉及關鍵字。委托構造函數使用所在類的其他構造函數,來完成初始化過程。優點就是少敲鍵盤。
class A{ private: int a,b; public: A(int a,int b){this->a=a,this->b=b;} A(int x):A(x,2){} #ifdef c98 //error: type `class A' is not a direct base of `A' #endif };
string與數值類型 互轉
string to_string (int val);//long、float、unsigned int 等數據類型的重載也都有。
string轉數值類型
int stoi (const string& str, size_t* idx = 0, int base = 10);
unsigned long long stoull (const string& str, size_t* idx = 0, int base = 10);
類似的,還有stod double、stof float、stoi int、stol long、。。。
最後更新:2017-04-03 05:39:19