Skip to content

C++11 的新特性

约 998 字大约 3 分钟

C++腾讯

2025-03-18

⭐ 题目日期:

腾讯 - 2024/12/20

📝 题解:

C++11 是 C++ 标准的重大更新,引入了许多现代编程特性,显著提升了代码的简洁性、安全性和性能。以下是 C++11 的核心新特性及其应用场景:


1. 自动类型推导(auto 关键字)

  • 作用:编译器自动推断变量类型,简化代码。

  • 示例

    auto i = 42;         // int
    auto str = "hello";  // const char*
    auto vec = std::vector<int>{1, 2, 3};
  • 适用场景:迭代器、复杂模板类型声明。


2. 范围基于的 for 循环

  • 作用:简化容器遍历。

  • 示例

    std::vector<int> nums = {1, 2, 3};
    for (auto& num : nums) {
        num *= 2;  // 修改容器元素
    }

3. 智能指针

  • 目的:自动管理动态内存,避免内存泄漏。

  • 类型

    • std::unique_ptr:独占所有权,不可复制。

      auto ptr = std::make_unique<int>(10);  // C++14 起支持 make_unique
    • std::shared_ptr:共享所有权(引用计数)。

      auto ptr = std::make_shared<int>(20);
    • std::weak_ptr:解决 shared_ptr 的循环引用问题。


4. 右值引用与移动语义(&&)

  • 核心思想:避免不必要的深拷贝,提升性能。

  • 移动构造函数

    class MyClass {
    public:
        MyClass(MyClass&& other) {  // 移动构造
            data = other.data;
            other.data = nullptr;  // 置空原对象
        }
    private:
        int* data;
    };
  • std::move:显式将左值转为右值。

    std::vector<int> v1 = {1, 2, 3};
    std::vector<int> v2 = std::move(v1);  // v1 变为空

5. Lambda 表达式

  • 作用:定义匿名函数,简化回调、算法参数。

  • 语法[捕获列表](参数) -> 返回类型 { 函数体 }

  • 示例

    std::vector<int> nums = {3, 1, 4};
    std::sort(nums.begin(), nums.end(), [](int a, int b) {
        return a > b;  // 降序排序
    });

6. nullptr 关键字

  • 替代 NULL:明确表示空指针,避免与整数 0 混淆。

    int* ptr = nullptr;  // 明确空指针

7. 强类型枚举(enum class)

  • 改进:避免传统枚举的作用域污染和隐式类型转换。

    enum class Color { Red, Green, Blue };
    Color c = Color::Red;  // 必须带作用域
    // int i = c;  // 错误:不能隐式转换

8. 并发支持(<thread>, <mutex>, <atomic>)

  • 多线程:标准化线程库。

    #include <thread>
    void task() { /* ... */ }
    std::thread t(task);  // 创建线程
    t.join();             // 等待线程结束
  • 原子操作

    #include <atomic>
    std::atomic<int> counter(0);
    counter++;  // 线程安全操作

9. 变长参数模板(Variadic Templates)

  • 作用:支持任意数量和类型的模板参数。

  • 示例(实现 printf 类似功能):

    template<typename T, typename... Args>
    void print(T first, Args... args) {
        std::cout << first << " ";
        print(args...);  // 递归展开
    }

10. 委托构造函数与继承构造函数

  • 委托构造函数:一个构造函数调用同类其他构造函数。

    class MyClass {
    public:
        MyClass(int a) : x(a) {}
        MyClass() : MyClass(0) {}  // 委托给有参构造
    private:
        int x;
    };
  • 继承构造函数:派生类直接继承基类构造函数。

    class Base {
    public:
        Base(int) {}
    };
    class Derived : public Base {
    public:
        using Base::Base;  // 继承基类构造函数
    };

11. 类型别名(using)

  • 替代 typedef:更清晰的语法。

    using IntVector = std::vector<int>;  // 等价于 typedef
    template<typename T>
    using MyAllocator = std::allocator<T>;  // 支持模板

12. constexpr 常量表达式

  • 作用:在编译期计算值,提升性能。

    constexpr int factorial(int n) {
        return (n <= 1) ? 1 : n * factorial(n - 1);
    }
    int arr[factorial(3)];  // 编译期计算数组大小为 6

13. 静态断言(static_assert)

  • 编译期断言:检查类型或常量条件。

    static_assert(sizeof(int) == 4, "int must be 4 bytes");

14. 统一初始化语法({})

  • 统一初始化:适用于所有类型。

    struct Point { int x, y; };
    Point p{1, 2};                // 结构体
    std::vector<int> vec{1, 2, 3}; // 容器
    int* arr = new int[3]{1, 2, 3};

总结

C++11 的现代化特性使得代码更简洁、高效和安全。核心改进包括:

  1. 简化代码auto、范围 for、Lambda。
  2. 内存安全:智能指针。
  3. 性能优化:右值引用、移动语义。
  4. 并发支持:线程库、原子操作。
  5. 类型安全enum classnullptr

这些特性奠定了现代 C++ 的基础,后续标准(C++14/17/20)在此基础上进一步扩展。