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. 右值引用

 

 

posted @ 2018-04-14 22:19  Kiven#5197  阅读(2959)  评论(0编辑  收藏  举报