外观
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)在此基础上进一步扩展。