C++11新標準
1. 新類型
long long和unsigned long long;
char16_t 和 char32_t;
新增原始字符串;
2. 統一的初始化
C++11擴大了用大括號括起的列表(初始化列表)的適用範圍,使其可以用於所有內置類型和用戶定義的類型(即類對象)。
使用初始化列表時,可添加 “=”,也可不添加。
int x = { 5 } ;
double y = { 2.75 } ;
short quar [ 5 ] { 4 , 5 , 2 , 76 , 1 } ;
另外,列表初始化語法也可用於new表達式中:
int * ar = new int [ 4 ] { 2 , 4 , 6 , 7 } ; // C++11
創建對象時,也可使用大括號(而不是圓括號)括起的列表來調用構造函數:
class Stump {
private:
int roots ;
double weight ;
pubilc:
Stump ( int r , double w ) : roots ( r ) , weight ( w ) { }
} ;
Stump s1 { 3 , 15.6 } ; // oid style
Stump s2 { 5 , 43.4 } ; // C++11
Stump s3 { 4 , 32.1 } ; // C++11
然而,如果類有將模板 std::initializer_list 作為參數的構造函數,則只有該構造函數可以使用列表初始化形式。
1. 縮窄
2. std::initializer_list
C++11提供了模板類initializer_list,可將其用作構造函數的參數。
如果類有接受initializer_list作為參數的構造函數,則初始化列表語法就只能用於該構造函數。列表中的元素必須是同一類型或可轉換為同一類型。
3. 聲明
3.1 auto
C++11將auto用於實現自動類型判斷。這要求進行顯示初始化,讓編譯器能夠將變量的類型設置為初始值的類型。
auto maton = 112 ; // maton is type int
auto pt = &maton ; // pt id type int *
double fm ( double , int ) ;
auto pf = fm ; // pf is type double (*) (double , int )
關鍵字auto還可簡化模板聲明。
例:
如果 il 是一個std::initializer_list<double>對象,則可將下述代碼:
for ( std :: initializer_list < double > :: iterator p = il.begin() ; p != il.end() ; p++ )
替換為如下代碼:
for ( auto p = il.begin() ; p != il.end() ; p ++ )
3.2 decltype
關鍵字decltype將變量的類型聲明為表達式指定的類型。
e.g.
int j = n ;
double x ;
decltype ( x*n ) q ; // q same type as x*n , i.e. , double
decltype ( &x ) pd ; // pd same type as &x , i.e. , double *
3.3 返回類型後置
doubel f1 ( double , int ) ; // traditi0nal syntax
auto f2 ( double , int ) -> double ; // new syntax , return type is double
可以配合3.2的decltype來指定模板函數的返回類型。
template < typename T , typename U >
auto eff ( T t , U u ) -> decltype ( T*U ) { }
3.4 模板別名:using =
typedef std :: vector < std :: string > :: iterator itType ; // old
using itType = std :: vector < std :: string > :: iterator ;
using 可以用於模板具體化, 但typedef不能。
3.5 nullptr指針
空指針
4. 智能指針
如果在程序中使用new從堆(自由存儲區)分配內存,等到不再需要時,應使用delete將其釋放。
C++引入了智能指針auto_ptr,以幫助自動完成這個過程。
C++11摒棄了auto_ptr並新增了unique_ptr,shared_ptr和weak_ptr。
5. 異常規範方面的修改
添加關鍵字noexcept
6. 作用域內枚舉
7.對類的修改
允許構造函數被繼承和彼此調用。
7.1 顯示轉換運算符
8. 模板和STL方面的修改
8.1 基於範圍的for循環
double prices [ 5 ] = { 4.99 , 10.99 , 6.87 , 7.99 , 8.49 } ;
for ( double x : prices )
std :: cout << x << std :: endl ;
8.2 新的STL容器
forward_lsit // 單向鏈表
unordered_map
unordered_multimap
unordered_set
unordered_multiset
8.3 新的STL方法
cbegin ( ) 和 cend ( )
8.4 valarray升級
8.5 摒棄export
8.6 尖括號
C++11不在要求在聲明嵌套模板時使用空格將尖括號分開
9. 右值引用
C++11新標準