以下是 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::mutex
,std::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 的编程范式影响
- 资源管理:智能指针替代裸指针,减少内存泄漏。
- 性能提升:移动语义减少不必要的拷贝。
- 泛型编程:
auto
和变参模板简化泛型代码。 - 并发支持:原生多线程库简化并行开发。
五、编译器支持
- GCC:4.8+ 完全支持。
- Clang:3.3+ 完全支持。
- MSVC:Visual Studio 2013+ 支持大部分特性。
总结
C++11 是现代 C++ 的基石,通过智能指针、移动语义、Lambda 等特性大幅提升代码的安全性、性能和可读性,奠定了后续版本(C++14/17/20)的基础。建议优先掌握 auto
、智能指针、右值引用和 Lambda 表达式,以快速提升开发效率。