外观
C++11 的新特性
⭐ 题目日期:
腾讯 - 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 的现代化特性使得代码更简洁、高效和安全。核心改进包括:
- 简化代码:auto、范围for、Lambda。
- 内存安全:智能指针。
- 性能优化:右值引用、移动语义。
- 并发支持:线程库、原子操作。
- 类型安全:enum class、nullptr。
这些特性奠定了现代 C++ 的基础,后续标准(C++14/17/20)在此基础上进一步扩展。
