1. 程式人生 > >C++11新標準

C++11新標準

weak_ptr mat clas weak 自動完成 分配內存 初始化 val decltype

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新標準