【C++Primer Plus 6th】C++11新特性

C++11数据类型特性

1.新增加了类型

   longlong 与unsigned long long 以支持对64 Int 类型的支持;新增加了char16_t与char32_t来支持char类型的16位与32位的字符表示 ; 新增加了auto关键字,让编译器根据初始值的类型推断变量的类型

2.右值引用

   传统的左值是一个表示数据的表达式(如变量名以及指针等),左值可以放于赋值表达式的左边;

    右值仅仅是一块数据(返回值,表达式结果值),右值一般可以放到赋值表达式的右边

   右值引用的出现,使得我们可以直接对这块右值数据进行引用,然后进行数据上的一些操作,避免重复的复制。

   举例

    符号重载+ 

     构造函数:参数为值引用

      构造函数:右值引用参数 

      

3.统一的初始化

   C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有内置类型和用户定义的类型(即类对象),使用初始化列表的时候可以添加等号(=),也可以省略

  模板 initializer_list 模板初始化列表

  您可以使用初始化列表来为Stl容器初始化为一系列值

   std::vector<double> a {6.5,7.47,3.65,5.45};

   支持初始化列表中进行隐式转换(精度由低到高)

4.模板别名

   typedef std::array<double,12>arrd ;

   typedef std::array<int,12>arri ;

   typedef std::array<float,12>arrf ;

   arrd a; arri b; arrf c; //使用别名来声明对象

  进行模板别名应用

  template <typename t >

  using arrtype  =  std::array<t,12>

  arrtype<double> a;

   arrtype<int>b;

   arrtype<float> c;

   11中还允许为非模板类进行定义别名

   

 

C++11结构流程新特性

1.基于范围的for循环

    double p[5] = {4.5,4.6,452.2,66.1};

     for(double x : p)      //非引用版本。替换表达式为 for( double &x : p)为引用版本

         cout<< x <<endl;

2.作用域内枚举

     传统枚举中,相同作用域下的相同枚举值将无法通过编译

     

      使用类作为枚举量的作用域

        

      其中作用域内枚举无法隐式完成整型转换,而传统可以 

 3.无序关联容器

    有序关联容器即普通的Map由红黑树构建底层,会根据键值进行排序,优化查找速率

    无序关联容器即HashMap底层由哈希表来构建,每次插入新值不会进行排序,未优化查找效率,但提高了删除和添加的效率

4. 异常规范

    在C++98中加入的异常规范,在C++11中不建议使用,以此来编译器优化代码

     原加入的异常规范举例:

      可以使用新增关键字noexception来显示保证函数不会引发异常

      

5.Lambda表达式 :允许在函数内定义函数表达式

   优势:相对于函数符(一种函数类),常规函数,lambda更加的简洁(代码量少)直接(定义与声明合二为一)

              高效(相对于函数指针,Lambda与函数符不会阻止内联优化)特殊功能(具有作用域变量引用/赋值)

   [](int x){     return ~;              }  省略返回值得类型是由decltype根据返回值进行推导的 (仅适用于函数体内包含仅return一条语句的情况)

  否则如果函数体内有多条语句:[](int x) -> double{ int y = 2; return y+x }  使用后置返回值

   重点:可以使用[&变量名称]来进行对作用域内的变量进行值引用使用,否则,为值传递  (类似于Lua中的UpValue概念)

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值