C++11新增特性

这是C++ Primer Plus第18章部分内容,做个总结

C++11新增的部分标准:

 

1.新类型  long long,unsigned long以支持64位或者更宽的整型;新增char16_t和char32_t以支持16位和32位的字符表示

2.统一的初始化,扩大了用大括号括起的初始化列表的适用范围,使其可用于所有的内置内型和用户定义的类型,使用初始化列     表时,可添加等号,也可以不添加。

3.C++11提供了多种简化声明的功能

   3.1 auto 自动类型推断

   3.2 decltype( x )  y;  让y的类型与x相同,x为表达式,定义模板时很有用

   3.3 返回类型后置

        double f1(double,int);             传统的声明

       auto f2(double,int) -> double;      返回类型后置

       这个主要用于模板函数

       template<typename T,typename U>

      auto eff( T t, U u)  -> decltype(T*U)

      {  …  }

   3.4 模板别名:using =

         以前:typedef std::vector<std::string>::iterator itType;

         现在:using itType = std::vector<std::string>::iterator ;

          也可用于模板部分具体化

   3.5 nullptr

4.智能指针         C++11 抛弃了auto_ptr 并新增了三种智能指针:unique_ptr ; shared_ptr ; weak_ptr

5. 摒弃了异常规范,新增关键字noexcept来指出函数不会引发异常有一定的价值

      void f875( short , short)  noexcept;

6. 作用域内枚举

    enum Old1 { yes , no , maybe };        传统的

    enum class New1{ never, sometimes, often , always };  新增

    enum struct New2 { never, lever , sever }; 新增

      新枚举要求进行显示限定,以免发生名称冲突。因此,引用特定枚举时,需使用New::never和New2::never。

7. 对类的修改  包括允许构造函数被继承和彼此调用、更佳的方法访问控制方式以及移动构造函数和移动赋值运算符。

    7.1显示转换运算符,关键字explicit,以禁止单参数构造函数导致的自动转换,c++11对此做了拓展

    7.2 类内成员初始化   

           通过使用类内初始化,可避免在构造函数中编写重复的代码,从而降低了程序员的工作量、厌倦情绪和 出错机会。如果构造函数在成员初始化列表中提供了相应的值,这些默认值将被覆盖。

8.模板和STL方面的修改

    8.1基于范围的for循环

          对于内置数组已经包含方法begin()和end()的类( 如std::string)和STL容器,基于范围的for循环可简化编写循环的工作。

          double prices[5] = { 4.99,1.1,6.6.8.8,9.99};

         for(double x : prices)  或者for(auto x : prices) 如果想改变值for(auto &x : prices)

              操作

    8.2 新的STL容器

         C++11新增了STL容器forward_list 、unordered_map、unordered_multimap、unord_set和unordered_multiset。

          容器forward_list是一种单向链表,只能沿着一个方向遍历;与双向链接的list容器相比更简单,占用存储空间更少。其他四            种容器都是使用哈希表实现的。

         新增模板类array      std::array<int,360> ar; //数组有360个数

    8.3 新的STL方法

         C++11新增cbegin(),cend(),crbegin(),crend(),这些方法将元素视为const

   8.4 valarray升级

        模板valarray独立于STL开发,其最初的设计导致无法将基于范围的STL算法用于valarray对象,c++11新增begin()和end()。

   8.5 摒弃关键字export

   8.6 尖括号

         为避免与运算符>>混淆,c++要求在声明嵌套模板时使用空格将尖括号分开

         vector<list<int> >;  //老版本

         vector<list<int>>;  //c++11

9.右值引用

    左值引用&  右值引用&&

     int x = 10;

     int y = 23;

     int && r1 = 13;

     int && r2 = x +y;

      double && r3 = sqrt(2.0);

     注意,r2关联到的是当时计算x+y得到的值,也就是说r2关联到23,即使以后修改了x或者y,也不会影响到r2。将右值关联到右值引用导致该右值被存储到特定的位置,且可以获取该位置的地址。也就是说,虽然不能将运算符&用于13,但可将其用于r1.通过将数据与特定地址关联,使得可以通过右值引用来访问数据。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值