10.c++11新特性

85 阅读4分钟

1. auto 关键字与类型推导

  • 一句话解释 :让编译器在编译时自动推断变量的类型,简化代码。
  • 核心用法 :
    // 以前需要写完整的类型
    std::vector<int> vec;
    std::vector<int>::iterator it = 
    vec.begin();
    
    // 使用 auto 后
    auto it2 = vec.begin(); // 自动推
    断为 std::vector<int>::iterator
    
    auto i = 42;       // i 是 int
    auto d = 3.14;     // d 是 double
    

2. 智能指针 (Smart Pointers)

  • 一句话解释 :解决了C++中手动管理内存( new / delete )的痛点,实现资源的自动释放(RAII)。
  • 核心用法 :
    • std::unique_ptr :独占式指针,确保同一时间只有一个指针指向资源。
      std::unique_ptr<intp1(new int
      (10))// p1 拥有这个 int
      // std::unique_ptr<int> p2 = 
      p1; // 编译错误,不允许拷贝
      std::unique_ptr<int> p3 = 
      std::move(p1); // 可以转移所有
      权,p1 变为空
      // p3 在离开作用域时会自动 delete 
      内存
      
    • std::shared_ptr :共享式指针,通过引用计数管理资源,当最后一个 shared_ptr 销毁时,资源才被释放。
      std::shared_ptr<intsp1(new 
      int(20));
      std::shared_ptr<int> sp2 = 
      sp1; // 引用计数变为 2
      std::cout << "Count: " << sp1.
      use_count() << std::endl// 输
      出 2
      // sp1 和 sp2 都离开作用域后,内存
      才被释放
      

3. Lambda 表达式

  • 一句话解释 :可以方便地定义和使用匿名函数,常用于STL算法。
  • 核心用法 :
    std::vector<int> nums = {12345};
    int x = 10;
    
    // [捕获列表](参数列表) -> 返回类型 
    { 函数体 }
    std::for_each(nums.begin(), nums.
    end(), [x](int n) {
        std::cout << n + x << 
        std::endl// 捕获了外部变量 x
    });
    

4. 基于范围的 for 循环 (Range-based for loop)

  • 一句话解释 :极大地简化了遍历容器或数组的操作。
  • 核心用法 :
    std::vector<int> v = {12345};
    
    // 遍历并读取元素
    for (int i : v) {
        std::cout << i << " ";
    }
    
    // 遍历并修改元素
    for (int &i : v) {
        i *= 2;
    }
    

5. nullptr

  • 一句话解释 :一个类型安全的空指针,用于替代宏 NULL ,避免了 NULL 可能带来的类型转换问题。
  • 核心用法 :
    void foo(int) {}
    void foo(char*) {}
    
    // foo(NULL); // 编译可能出错或不符
    合预期,因为 NULL 可能是 0
    foo(nullptr); // 正确调用 foo
    (char*)
    

6. 右值引用 (&&) 与移动语义 (Move Semantics)

  • 一句话解释 :通过“窃取”临时对象(右值)的资源来初始化新对象,避免了不必要的深拷贝,大幅提升性能。
  • 核心用法 :
    std::string str1 = "hello";
    // std::move 将左值强制转换为右值引
    用,str1 的内容被“移动”到 str2
    // 之后 str1 的状态是未定义的,不能再
    使用
    std::string str2 = std::move
    (str1);
    
    std::cout << "str2: " << str2 << 
    std::endl// 输出 "hello"
    // std::cout << "str1: " << str1 
    << std::endl// 行为未定义
    ``` 移动语义是许多STL容器(如 std::vector )在扩容时性能提升的关键。
    

7. 统一初始化 ({})

  • 一句话解释 :提供了一种统一的语法来初始化任何类型的对象(普通变量、数组、类对象、STL容器等)。
  • 核心用法 :
    int x{0};
    int arr[4]{1234};
    std::vector<int> v{123};
    std::map<std::stringint> m
    {{"apple"1}, {"banana"2}};
    
    // 防止窄化转换,更安全
    // int y = 7.7; // 编译通过,但有警
    告,y 值为 7
    // int z{7.7};  // 编译错误!不允许
    窄化转换
    

8. constexpr

  • 一句话解释 :让常量表达式(在编译期就能计算出结果的表达式)可以用于定义常量、数组大小等,并将计算过程从运行时提前到编译时。
  • 核心用法 :
    constexpr int square(int x) {
        return x * x;
    }
    
    const int val = square(5); // 在
    编译期计算出结果 25
    int arr[square(4)]; // 合法,数组
    大小在编译期确定为 16
    

9. 新增STL容器

  • 一句话解释 :引入了更高效或更特定用途的容器。
  • 核心用法 :
    • std::unordered_map / std::unordered_set :基于哈希表实现,在大多数情况下查找、插入、删除的平均时间复杂度为O(1),比 std::map (红黑树,O(logN))更快。
    • std::array :固定大小的数组,封装了原生数组,提供了更安全、更现代的接口(如迭代器、 size() 方法)。

10. 多线程库 (, )

  • 一句话解释 :首次在语言标准层面提供了跨平台的线程支持,使编写多线程程序变得简单和标准化。
  • 核心用法 :
    #include <iostream>
    #include <thread>
    #include <mutex>
    
    std::mutex mtx;
    
    void print_message(const 
    std::string& msg) {
        mtx.lock(); // 加锁
        std::cout << msg << 
        std::endl;
        mtx.unlock(); // 解锁
    }
    
    int main() {
        std::thread t1
        (print_message, "Hello from 
        thread 1");
        std::thread t2
        (print_message, "Hello from 
        thread 2");
    
        t1.join();
        t2.join();
    
        return 0;
    }
    

掌握以上10个特性,你对C++11的理解就已经达到了一个非常扎实的水平。