C++11引入了许多新特性,使得C++编程更加简洁、高效和现代化。以下是C++11中一些重要的新特性:
1. 自动类型推导(auto)
auto
关键字允许编译器根据初始化表达式自动推导变量的类型,减少了代码中的冗余。
auto intVar = 42; // intVar 被推导为 int 类型
auto doubleVar = 3.14; // doubleVar 被推导为 double 类型
2. 范围for循环(Range-based for Loop)
范围for循环提供了一种更简洁的遍历数组或容器的方式。
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto num : vec)
{
std::cout << num << " ";
}
3. Lambda表达式
Lambda表达式(匿名函数)允许在函数内部定义小型函数对象,适用于排序、过滤等场景。
auto add = [](int a, int b) { return a + b; };
std::cout << add(2, 3); // 输出 5
4. 智能指针
C++11引入了std::unique_ptr
和std::shared_ptr
,提供自动管理内存的功能,防止内存泄漏。
std::unique_ptr<int> ptr = std::make_unique<int>(10);
std::shared_ptr<int> sharedPtr = std::make_shared<int>(20);
5. 右值引用和移动语义
右值引用(&&
)允许函数通过移动语义实现高效的资源转移,减少不必要的拷贝。
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = std::move(vec1); // vec1 被“移动”到 vec2 中
6. constexpr
constexpr
关键字用于声明常量表达式,在编译时计算其值,确保高效的代码执行。
constexpr int square(int x) { return x * x; }
constexpr int result = square(5); // result 在编译时被计算为 25
7. 新型初始化方式
C++11引入了统一的花括号{}
初始化,提供了更一致和安全的初始化方式。
int arr[] = {1, 2, 3}; // 数组初始化
std::vector<int> vec = {1, 2, 3}; // 容器初始化
8. 线程库
C++11新增了<thread>
库,提供了对多线程编程的标准支持,包括线程创建、互斥锁、条件变量等。
#include <thread>
void printHello()
{
std::cout << "Hello, World!";
}
int main()
{
std::thread t(printHello);
t.join(); // 等待线程t完成
return 0;
}
9. nullptr
nullptr
取代了传统的NULL
宏,提供了一种类型安全的空指针表示法。
int* ptr = nullptr;
10. 静态断言(static_assert)
static_assert
允许在编译时进行断言,确保程序的某些条件在编译期得到验证。
static_assert(sizeof(int) == 4, "int size is not 4 bytes");
11. enum class
(强类型枚举)
enum class
引入了强类型的枚举,避免传统枚举类型中不同枚举值之间的混淆。
enum class Color { Red, Green, Blue };
Color color = Color::Red;
12. std::array
和 std::tuple
C++11新增了std::array
和std::tuple
,提供了更现代化和灵活的数组与多元组支持。
std::array<int, 3> arr = {1, 2, 3};
std::tuple<int, double, std::string> tpl(1, 2.0, "Hello");
C++11引入的这些特性大大增强了语言的表达能力和安全性,同时提高了编写高效代码的便捷性。这些特性在现代C++开发中已广泛应用,为开发者提供了更多的工具和更灵活的编程方式。