C++11 和 C++14 引入了许多新特性,使得 C++ 编程更加现代化和高效。以下是你提到的一些关键特性的简要说明:
1. auto
关键字
-
C++11 引入了
auto
关键字,用于自动推导变量的类型。编译器会根据初始化表达式自动推断变量的类型。auto x = 42; // x 的类型被推导为 int auto y = 3.14; // y 的类型被推导为 double auto z = "hello"; // z 的类型被推导为 const char*
-
这个特性在模板编程和复杂类型声明中特别有用,可以减少代码冗余。
2. 范围 for
循环
-
C++11 引入了基于范围的
for
循环,使得遍历容器(如数组、向量等)更加简洁。std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto& elem : vec) { std::cout << elem << std::endl; }
-
这种循环语法避免了手动管理迭代器,代码更加清晰。
3. 智能指针
-
C++11 引入了三种智能指针:
std::unique_ptr
,std::shared_ptr
, 和std::weak_ptr
,用于自动管理动态内存,避免内存泄漏。-
std::unique_ptr
: 独占所有权的智能指针,不能复制,只能移动。std::unique_ptr<int> ptr(new int(10));
-
std::shared_ptr
: 共享所有权的智能指针,使用引用计数来管理资源。std::shared_ptr<int> ptr1 = std::make_shared<int>(10); std::shared_ptr<int> ptr2 = ptr1; // 引用计数增加
-
std::weak_ptr
: 弱引用指针,不增加引用计数,通常与std::shared_ptr
配合使用,避免循环引用。std::weak_ptr<int> wptr = ptr1;
-
4. Lambda 表达式
-
C++11 引入了 Lambda 表达式,允许在代码中定义匿名函数。
auto add = [](int a, int b) { return a + b; }; int result = add(3, 4); // result = 7
-
Lambda 表达式可以捕获外部变量,并且可以指定捕获方式(按值或按引用)。
int x = 10; auto lambda = [x](int y) { return x + y; };
5. 移动语义与右值引用
-
C++11 引入了移动语义和右值引用,允许资源的高效转移,而不是复制。
-
右值引用 使用
&&
表示,通常用于临时对象或即将销毁的对象。void foo(int&& x) { // x 是一个右值引用 }
-
移动语义 通过
std::move
实现,可以将资源从一个对象转移到另一个对象,避免不必要的复制。std::vector<int> v1 = {1, 2, 3}; std::vector<int> v2 = std::move(v1); // v1 的资源被移动到 v2,v1 现在为空
-
-
移动语义在实现高性能的容器和资源管理类时非常有用。
C++14 的改进
-
C++14 在 C++11 的基础上进一步简化了代码编写,并引入了一些新特性:
-
泛型 Lambda:Lambda 表达式可以接受
auto
参数。auto lambda = [](auto x, auto y) { return x + y; };
-
std::make_unique
:C++14 引入了std::make_unique
,类似于std::make_shared
,用于创建std::unique_ptr
。auto ptr = std::make_unique<int>(10);
-
二进制字面量:C++14 支持二进制字面量。
int x = 0b101010; // x = 42
-
这些新特性使得 C++ 编程更加现代化、简洁和高效,特别是在处理复杂类型、内存管理和并发编程时。