C++基础C++11的新特性

Posted 贺二公子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础C++11的新特性相关的知识,希望对你有一定的参考价值。

原文地址:https://blog.csdn.net/dnty00/article/details/126171485


文章目录

一、C++11新特性

C++新特性主要包括包含语法改进和标准库扩充两个方面,主要包括以下11点

1、语法的改进

  1. 统一的初始化方法
    在 C++11 中,可以直接在变量名后面跟上初始化列表,来进行对象的初始化
  2. 成员变量默认初始化
  3. auto关键字 用于定义变量,编译器可以自动判断的类型(前提:定义一个变量时对其进行初始化)**
  4. decltype 求表达式的类型
  5. 智能指针 shared_ptr
    和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存。并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆内存才会被自动释放)
  6. 空指针 nullptr(原来NULL)
  7. 基于范围的for循环
  8. 右值引用和move语义
    • 右值引用

      //左值引用
      int num = 10;
      int &b = num;  //正确
      int &c = 10;   //错误,在C++98/03标准中,无法为右值添加引用
      

      实际开发中可能需要对右值进行修改(实现移动语义时就需要),显然左值引用的方式是行不通的。为此,C++11 标准新引入了另一种引用方式,称为右值引用,用 “&&” 表示。

      int num = 10;
      //int && a = num;  //右值引用不能初始化为左值
      int && a = 10;
      
    • move语义
      在C++11中,标准库在中提供了一个有用的函数std::move,std::move()函数并不能移动任何东西,它唯一的功能是将一个左值引用强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。从实现上讲,std::move基本等同于一个类型转换:static_cast<T&&>(lvalue);

      move( arg ) //其中,arg 表示指定的左值对象。该函数会返回 arg 对象的右值形式。
      

2、标准库扩充(往STL里新加进一些模板类,比较好用)

  1. 无序容器(哈希表)
    用法和功能同map一模一样,区别在于哈希表的效率更高

  2. 正则表达式
    可以认为正则表达式实质上是一个字符串,该字符串描述了一种特定模式的字符串

  3. Lambda表达式
    lambda表达式是一个匿名函数,用于定义并创建匿名的函数对象,以简化编程工作。举个例子:

    vector<int> vec;
    sort(vec.begin(), vec.end(), cmp); // 旧式
    sort(vec.begin(), vec.end(), [](int a, int b) -> bool  return a < b; );   // Lambda表达式
    

    声明lambda表达式:

    [capture list] (params list) mutable exception-> return type  function body 
    
    • capture list:捕获外部变量列表
    • params list:形参列表
    • mutable指示符:用来说用是否可以修改捕获的变量
    • exception:异常设定
    • return type:返回类型
    • function body:函数体

二、智能指针

为什么要使用智能指针:
智能指针的作用是管理一个指针,因为存在申请的空间在函数结束时忘记释放,造成内存泄漏的情况。使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间
智能指针的作用:处理内存泄漏问题和空悬指针问题。

C++中的智能指针有4种,分别为:shared_ptr、unique_ptr、weak_ptr、auto_ptr,其中auto_ptr被C++11弃用。

  • 对于shared_ptr,可解决资源忘记释放的内存泄漏问题,及悬空指针问题。
    *shared_ptr实现共享式拥有的概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。

  • 对于unique_ptr,对象对其有唯一所有权。
    unique_ptr实现独占式拥有的概念,同一时间只能有一个智能指针可以指向该对象,它对于避免资源泄露,因为无法进行拷贝构造和拷贝赋值,但是可以进行移动构造和移动赋值。

  • 对于weak_ptr,和 shared_ptr 搭配,不会增加引用计数,用于避免循环引用(比如 a 对象持有 b 对象,b 对象持有 a 对象),这样必然会导致内存泄露。
    解决shared_ptr相互引用时,两个指针的引用计数永远不会下降为0,从而导致死锁问题。而weak_ptr是对对象的一种弱引用,可以绑定到shared_ptr,但不会增加对象的引用计数

  • 对于auto_ptr,实现独占式拥有的概念,同一时间只能有一个智能指针可以指向该对象;但auto_ptr在C++11中被摒弃,其主要问题在于:
    1)对象所有权的转移,比如在函数传参过程中,对象所有权不会返还,从而存在潜在的内存崩溃问题;
    2)不能指向数组,也不能作为STL容器的成员

以上是关于C++基础C++11的新特性的主要内容,如果未能解决你的问题,请参考以下文章

C++11 现代C++风格的新元素--简介

C++基础——C++相比C语言的新特性梳理总结(C++新特性输入输出方式命名空间namespace)

C#与C++的发展历程第一 - 由C#3.0起

从effective C++中窥探C++11特性

C++:C++11新特性超详细版

C++ 11 新特性之正则表达式