C++11 是 C++ 语言的一个重要标准更新,增加了许多新特性,提升了开发效率、性能和可读性。以下是 C++11 中一些关键的新特性:
1. 自动类型推导 (auto
)
使用 auto
关键字可以自动推导变量的类型,减少代码的冗余。
auto i = 10; // int 类型
auto d = 3.14; // double 类型
2. 范围 for
循环
引入了基于范围的 for
循环,更简洁地遍历容器。
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto v : vec) {
std::cout << v << " ";
}
3. Lambda 表达式
支持匿名函数,方便实现轻量的函数对象,特别是在需要回调或 STL 算法时。
auto add = [](int a, int b) { return a + b; };
std::cout << add(3, 4); // 输出 7
4. 智能指针 (std::shared_ptr
和 std::unique_ptr
)
C++11 提供了两种常用的智能指针来管理动态内存,减少内存泄漏问题。
std::shared_ptr
支持多个对象共享同一个指针,引用计数自动管理内存。std::unique_ptr
独占资源,确保同一时间只能有一个指针拥有对象。
std::shared_ptr<int> sptr = std::make_shared<int>(10);
std::unique_ptr<int> uptr = std::make_unique<int>(20);
5. 右值引用和移动语义
C++11 引入了右值引用 (&&
) 和移动语义,优化了对象复制的效率,避免不必要的拷贝。
std::string s1 = "Hello";
std::string s2 = std::move(s1); // 移动语义,s1 的内容被转移给 s2
6. 变长参数模板 (Variadic Templates)
变长参数模板允许定义接受任意数量模板参数的函数或类。
template<typename... Args>
void print(Args... args) {
(std::cout << ... << args) << '\n'; // 折叠表达式
}
7. 线程库 (<thread>
)
C++11 引入了标准的多线程库,提供了线程的创建与管理,并增加了同步机制,如互斥锁(std::mutex
)。
std::thread t([] { std::cout << "Thread running\n"; });
t.join();
8. nullptr
关键字
用于代替 NULL
,表示空指针,避免类型不匹配问题。
int* p = nullptr; // 空指针
9. constexpr
常量表达式
constexpr
允许在编译时计算常量值,提升性能。
constexpr int square(int x) { return x * x; }
int result = square(5); // 编译时计算结果
10. 枚举类 (enum class
)
enum class
提供了作用域范围的枚举类型,避免与其他符号冲突。
enum class Color { Red, Green, Blue };
Color c = Color::Red;
11. 初始化列表 (std::initializer_list
)
C++11 支持使用花括号进行列表初始化,方便容器和对象的初始化。
std::vector<int> vec = {1, 2, 3, 4};
12. 统一的初始化语法
引入了统一的初始化语法,允许使用 {}
进行初始化。
int x{10};
std::vector<int> vec{1, 2, 3};
13. 新 std::function
和 std::bind
std::function
提供了类型安全的函数包装器,std::bind
用于绑定函数参数或部分调用。
std::function<int(int)> f = [](int x) { return x + 1; };
14. decltype
关键字
decltype
关键字可以推断表达式的类型,常用于模板编程中。
int a = 10;
decltype(a) b = 20; // b 的类型为 int
15. 静态断言 (static_assert
)
static_assert
在编译时检查条件是否为真,用于捕获编译期错误。
static_assert(sizeof(int) == 4, "Unexpected int size");
C++11 的引入大大增强了 C++ 语言的表达能力、效率和易用性,使得代码更加现代化,简洁和高效。