【C++】C++11特性的详解

以下是 C++11 特性的详细总结,涵盖核心语言改进、标准库更新及编程范式革新:


一、核心语言特性

1. 自动类型推导 (auto)
  • 功能:根据初始化表达式自动推断变量类型,简化代码。
  • 示例
    auto i = 42;          // int
    auto str = "Hello";   // const char*
    auto& ref = i;        // int&
  • 限制:不可用于函数参数或非静态成员变量。
2. 右值引用与移动语义
  • 右值引用 (&&):标识临时对象(右值),支持资源的高效转移。
  • 移动构造函数/赋值运算符:避免深拷贝,提升性能。
    class MyString {
    public:
        // 移动构造函数
        MyString(MyString&& other) noexcept 
            : data_(other.data_), size_(other.size_) {
            other.data_ = nullptr;  // 置空原对象,避免重复释放
        }
    private:
        char* data_;
        size_t size_;
    };
  • std::move:将左值显式转换为右值引用。
    std::string s1 = "Hello";
    std::string s2 = std::move(s1);  // s1 变为空字符串
3. 范围 for 循环
  • 功能:简化容器遍历语法。
  • 示例
     
    std::vector<int> vec = {1, 2, 3};
    for (auto& num : vec) {  // 引用避免拷贝
        num *= 2;
    }
4. Lambda 表达式
  • 功能:定义匿名函数,常用于 STL 算法。
  • 语法[捕获列表](参数) -> 返回类型 { 函数体 }
  • 示例
    std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
  • 捕获方式
    • [=]:按值捕获外部变量。
    • [&]:按引用捕获外部变量。
    • [x, &y]:混合捕获。
5. 强类型枚举 (enum class)
  • 功能:避免传统枚举的作用域污染和隐式类型转换。
  • 示例
    enum class Color { Red, Green, Blue };
    Color c = Color::Red;
    // if (c == 0) {}  // 错误:无法隐式转换为整数
6. nullptr
  • 功能:替代 NULL 或 0,明确表示空指针。
  • 示例
    int* p = nullptr;
    void foo(int* ptr) {}
    foo(nullptr);  // 明确传递空指针
7. 委托构造函数
  • 功能:一个构造函数调用同类其他构造函数,减少重复代码。
  • 示例
    class MyClass {
    public:
        MyClass(int x) : MyClass(x, 0) {}  // 委托给另一个构造函数

Class(int x, int y) : x_(x), y_(y) {}
private:
int x_, y_;
};


#### ​**8. `override` 和 `final`**  
- ​**`override`**:显式标记派生类重写的虚函数,避免拼写错误。  
- ​**`final`**:禁止类被继承或虚函数被重写。  
```cpp
class Base {
public:
    virtual void foo() {}
};
class Derived : public Base {
public:
    void foo() override {}  // 正确重写
    virtual void bar() final {}
};
class Child : public Derived {
    // void bar() {}  // 错误:bar 被标记为 final
};
9. 变长参数模板
  • 功能:支持任意数量和类型的模板参数。
  • 示例
    template<typename... Args>
    void print(Args... args) {
        (std::cout << ... << args) << "\n";  // C++17 折叠表达式(C++11 需递归展开)
    }
    print(1, "Hello", 3.14);  // 输出 1Hello3.14
10. constexpr 常量表达式
  • 功能:在编译时求值的表达式或函数。
  • 示例
    constexpr int factorial(int n) {
        return (n <= 1) ? 1 : n * factorial(n - 1);
    }
    int arr[factorial(5)];  // 编译时计算数组大小为 120
11. 统一初始化 ({})
  • 功能:统一变量初始化的语法,避免歧义。
  • 示例
    int x{5};               // int
    std::vector<int> vec{1, 2, 3};  // 初始化列表
    class MyClass {
        int x{0};  // 类内成员初始化
    };

二、标准库更新

1. 智能指针
  • std::unique_ptr:独占资源所有权,不可复制,移动语义转移所有权。
    auto ptr = std::make_unique<int>(42);
  • std::shared_ptr:共享所有权(引用计数)。
    auto ptr = std::make_shared<int>(42);
  • std::weak_ptr:解决 shared_ptr 循环引用问题。
2. 无序容器
  • 功能:基于哈希表的容器(平均 O(1) 复杂度)。
  • 示例
    std::unordered_map<std::string, int> wordCount;
    wordCount["hello"] = 1;
3. 正则表达式库 (<regex>)
  • 功能:支持正则表达式匹配、搜索和替换。
  • 示例
    std::string text = "123abc";
    std::regex pattern(R"(\d+)");
    if (std::regex_search(text, pattern)) {
        std::cout << "Found digits!";
    }
4. 多线程支持 (<thread><mutex>)
  • std::thread:原生线程支持。
    void task() { /* ... */ }
    std::thread t(task);
    t.join();
  • 互斥量std::mutexstd::lock_guard
    std::mutex mtx;
    {
        std::lock_guard<std::mutex> lock(mtx);  // 自动释放锁
        // 临界区代码
    }
5. 时间库 (<chrono>)
  • 功能:高精度时间测量和计算。
  • 示例
    auto start = std::chrono::high_resolution_clock::now();
    // 执行代码
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = end - start;
6. std::tuple
  • 功能:存储多个不同类型的值。
  • 示例
    auto t = std::make_tuple(42, "Hello", 3.14);
    int num = std::get<0>(t);  // 获取第一个元素

三、其他重要改进

1. 静态断言 (static_assert)
  • 功能:编译时断言检查。
  • 示例
    static_assert(sizeof(int) == 4, "int must be 4 bytes");
2. 右值引用优化 (RVO/NRVO)
  • 返回值优化:编译器自动避免临时对象的拷贝。
3. 外部模板 (extern template)
  • 功能:显式禁止隐式模板实例化,减少编译时间。
    extern template::vector<int>;  // 声明
4. 字面量运算符
  • 功能:自定义字面量后缀。
  • 示例
    long double operator"" _km(long double d) { return d * 1000; }
    auto distance = 5.0_km;  // 5000.0

四、C++11 的编程范式影响

  1. 资源管理:智能指针替代裸指针,减少内存泄漏。
  2. 性能提升:移动语义减少不必要的拷贝。
  3. 泛型编程auto 和变参模板简化泛型代码。
  4. 并发支持:原生多线程库简化并行开发。

五、编译器支持

  • GCC:4.8+ 完全支持。
  • Clang:3.3+ 完全支持。
  • MSVC:Visual Studio 2013+ 支持大部分特性。

总结

C++11 是现代 C++ 的基石,通过智能指针、移动语义、Lambda 等特性大幅提升代码的安全性性能可读性,奠定了后续版本(C++14/17/20)的基础。建议优先掌握 auto、智能指针、右值引用和 Lambda 表达式,以快速提升开发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值