C++11的新特性_吃鱼的小脸猫_新浪博客

一、c++11新特性
  **1、关键字:**
(1)Auto
         早期c/c++是具有自动存储期的局部变量;
         在c++11中属于一个类型声明的占位符,同时auto声明的变量必须初始化,以便
编译器能通过初始化表达式推出其变量类型;
       优点:
               (1)在拥有初始化表达式的复杂类型变量时声明简化了代码
               (2)避免了声明类型时发生的声明类型错误
               (3)在C++中的一定程度能够支持泛型的编程,可以达到代码的跨平台效果
      注意事项:
               (1)auto声明的变量必须初始化
               (2)auto不能同其他组合类型连用
               (3)auto属于一个占位符,不属于类型,所以不能用于类型转换以及sizeof
               (4)函数参数和模板参数不可以声明为auto类型
               (5)auto会退化成指向数组的指针,除非被声明为引用
                                 Int arr[10];
                                auto j = a;(typied(arr).name = int * )
                               auto k = &a;(typied(arr).name = int [] )
              (6)auto作函数返回值,必须是用于定义函数,不能用于声明函数
(2)nullptr
         使用nullptr代替NULL的原因:
              (1)NULL在c中属于一个宏:#define NULL ((void*)0)
             (2)C++中为了解决重载的问题,将NULL定义为0;
                        nullptr则是用于标识空指针,属于一个关键字,可以转化成任何指针类
                        型和bool类型,但不能用于转换成常数;
             (3)引入nullptr是为了解决NULL在C++中不知道调用哪个函数的问题
                            Void  Test(int a)                  void  Test(int *a)
                             {                                                  {
                              //调用的是NULL                        //调用的是nullptr
                              }                                                 }
(3)__func__: 用于获得当前函数名字符串的宏
                              const char * Stanard_Macros(void)
                           {             
                              return __func__; //返回值:Stanard_Macros   
                         } 
(4)static_assert:
           断言来解决问题,它支持两个参数输入,一个是返回bool型的表达式,另一个是警     
           告信息。
(5)final和override控制:
        final用来限制基类虚函数的对应的派生类不能重写该虚函数,从而避免了某些接口被  
         重写覆盖; 
        override则指定了函数必须重载基类的虚函数,否则编译通不过,这就避免了某些输
       入名或者原型不匹配等错误的发生
(6)for循环:基于范围的迭代写法
               // & 启用了引用,改变后的vector中的遍历
                    for(auto &i : arr) 
                 {    
                       std::cout << i << std::endl;
                  }
 **2、初始化对象**:
         C++11 提供了统一的语法来初始化任意的对象;
         C++11 还把初始化列表的概念绑定到了类型上,并将其称之为 std::initializer_list, 
         允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普
         通数组和 POD 的初始化方法提供了统一的桥梁。
          #include
           class Magic {
            public:
                  Magic(std::initializer_list list) {}
            };
           Magic magic = {1,2,3,4,5};
           std::vector v = {1, 2, 3, 4};
   **3、Lambda 表达式,**
          实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但 
          是又不想费力去命名一个函数的情况下去使用的。//后续补充
   **4、STL容器**:
   (1)Std::array
     std::array 保存在栈内存中,相比堆内存中的 std::vector,我们能够灵活的访问这里面
      的元素,从而获得更高的性能。
     std::array 会在编译时创建一个固定大小的数组,std::array 不能够被隐式的转换成指
     针,使用 std::array只需指定其类型和大小即可:
 (2)std:forward_list
     std::forward_list 是一个列表容器,使用方法和 std::list 基本类似。 
     和 std::list 的双向链表的实现不同,std::forward_list 使用单向链表进行实现,提供了 
     O(1) 复杂度的元素插入,不支持快速随机访问(这也是链表的特点),也是标准库容
     器中唯一一个不提供 size() 方法的容器。当不需要双向迭代时,具有比 std::list 更高的
     空间利用率。
**5、多线程:**
(1)std::thread:
     解决了boost::thread中构成参数限制的问题
(2)std::atomic:  
     C++11中封装的原子数据类型(原子数据类型:不会发生数据竞争,能够直接使用在多线程中不需要加解锁的过程)  
**6、智能指针**:后续有详细补充
        (1)auto_ptr:有所有权唯一的问题
        (2)unique_ptr:不能进行赋值拷贝的问题
        (3)shared_ptr:引用了计数器,当为0时(即无对象引用这块内存时,释放掉这块   
                    内存)
        (4)weak_ptr:解决了shared_ptr中循环引用的问题,与shared_ptr搭配使用
部分内容参考自:
   https://www.cnblogs.com/feng-sc/p/5710724.html
   https://blog.csdn.net/jiange_zh/article/details/79356417

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值