一、背景简介
在讨论C++11的特性之前,可以简单提一下:
C++98/03是传统标准,已使用多年。而C++11(之前叫C++0x)是为了应对现代硬件多核、多任务的需求,加入了许多新功能,提升了语言的性能、表达力和安全性。
二、C++11的主要新特性
我会分类讲解,方便理解。
1. 自动类型推导
auto
关键字:让编译器自行推导变量类型,减少冗余。
复制代码
auto n = 10; // int
auto p = new int(20); // int*
auto lambda = [](int x){ return x + 1; }; // lambda表达式自动推导
// 作用:让代码更简洁、更易维护
decltype
:获取表达式的类型,支持复杂类型推导。
2. 智能指针
引入标准库的智能指针,大大提升内存管理的安全性。
std::shared_ptr
:引用计数共享所有权。std::unique_ptr
:唯一所有权,轻量级。
复制代码
std::shared_ptr<int> sp1 = std::make_shared<int>(5);
auto up = std::make_unique<int>(10);
**作用:**避免手工调用delete
,减少内存泄漏。
3. 不可复制的对象:= delete
和 = default
- 删除函数(
= delete
):让某些函数不可用,常用在防止复制。
复制代码
class NonCopyable {
public:
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete; // 禁止拷贝
NonCopyable& operator=(const NonCopyable&) = delete;
};
- 默认函数(
= default
):显式声明编译器生成的默认实现。
复制代码
class Foo {
public:
Foo() = default; // 使用编译器默认构造函数
};
4. 移动语义(rvalue
、移动构造和移动赋值)
rvalue
引用(&&
):支持“资源转移”,显著提升性能(尤其在容器中)。- 移动构造函数 和 移动赋值运算符:实现“资源的转移”。
复制代码
class String {
public:
String(String&& other); // 移动构造
String& operator=(String&& other); // 移动赋值
};
**作用:**在返回临时对象、容器和资源管理方面大大提高效率。
5. Lambda表达式
匿名函数,简化回调和算法。
复制代码
auto add = [](int a, int b) { return a + b; };
int sum = add(3, 4); // 7
支持捕获外部变量(值或引用)、可变(mutable
)、参数和返回值。
6. 智能成员初始化(非静态成员初始化)
复制代码
class Person {
public:
std::string name = "Jane";
int age = 20;
};
不用在构造函数里重复初始化。
7. constexpr
用于编译时常量和函数,提升程序的计算能力。
复制代码
constexpr int square(int x) {
return x * x;
}
static_assert(square(5) == 25, "Error");
8. thread
支持(多线程)
加入标准库的多线程支持,是面向多核时代的重大升级。
std::thread
- 互斥锁(
std::mutex
) - 条件变量(
std::condition_variable
)
复制代码
std::thread t([]{ std::cout << "Hello from thread\n"; });
t.join();
9. enum class
(强类型枚举)
解决传统枚举的命名污染和类型安全问题。
复制代码
enum class Color { Red, Green, Blue };
Color c = Color::Red;
避免命名冲突,也更易调试。
10. 初始化列表(initializer_list
)
方便统一初始化对象。
复制代码
class MyClass {
public:
MyClass(std::initializer_list<int> list) {
for (auto it = list.begin(); it != list.end(); ++it)
// 处理
}
};
MyClass obj = {1, 2, 3};
11. static_assert
在编译期进行断言,提前捕获错误。
复制代码
static_assert(sizeof(int) == 4, "int must be 4 bytes");
12. explicit
的扩展
支持explicit
构造函数只在单参数时可以隐式调用。
三、总结:C++11的核心亮点
特性类别 | 关键点 | 作用/意义 |
---|---|---|
语法简化 | auto , decltype , nullptr , constexpr |
提升代码简洁性和表达力 |
内存安全 | 智能指针(shared_ptr 、unique_ptr ) |
避免内存泄漏,管理动态资源 |
性能优化 | 移动语义(rvalue 引用、移动构造/赋值) |
资源转移,避免不必要的复制 |
多线程支持 | thread , mutex , condition_variable |
搭建多核多任务环境的基础 |
类型安全 | enum class , delete / default |
强类型枚举,禁止部分函数,安全性提升 |
编译期优化 | static_assert 、constexpr |
提升编译时检查能力 |
其他增强 | lambda表达式、初始化列表、explicit 等 |
提升表达能力,写出更漂亮、更健壮的代码 |
四、总结一句话版本
C++11带来了更简洁、更安全、更高效的表达能力,包括自动类型推导、智能指针、移动语义、lambda表达式、多线程支持、强类型枚举和编译时优化等一系列革命性特性,是现代C++编程不可或缺的基础。