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<int> p1(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<int> sp1(new int(20)); std::shared_ptr<int> sp2 = sp1; // 引用计数变为 2 std::cout << "Count: " << sp1. use_count() << std::endl; // 输 出 2 // sp1 和 sp2 都离开作用域后,内存 才被释放
- std::unique_ptr :独占式指针,确保同一时间只有一个指针指向资源。
3. Lambda 表达式
- 一句话解释 :可以方便地定义和使用匿名函数,常用于STL算法。
- 核心用法 :
std::vector<int> nums = {1, 2, 3, 4, 5}; 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 = {1, 2, 3, 4, 5}; // 遍历并读取元素 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]{1, 2, 3, 4}; std::vector<int> v{1, 2, 3}; std::map<std::string, int> 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的理解就已经达到了一个非常扎实的水平。