目录
一、为什么一定要学 C++11?
二、auto:让编译器做它最擅长的事
1.auto 解决了什么问题?
2.auto 的正确用法
3.auto 的边界(高质量代码必须知道)
三、nullptr:彻底告别“指针陷阱”
1.NULL 的历史问题
2.nullptr 的本质
3.正确实践
四、范围 for:让“遍历”回归本质
1.传统 for 的问题
2.C++11 范围 for
3.什么时候用引用?
五、enum class:真正类型安全的枚举
1.传统 enum 的隐患
2.enum class 的改进
3.推荐规范
六、using:typedef 的现代替代方案
1.typedef 的局限
2.using 的优势
七、constexpr:让“计算”发生在编译期
1.编译期常量的价值
2.constexpr 示例
八、本篇总结
一、为什么一定要学 C++11?
在真实工程和面试中:
-
会 C++98 → 代码陈旧
-
不懂 C++11 → 无法阅读现代代码
-
不会用 → 写不出高质量 C++
现代 C++ 的核心目标只有三个:
更安全(少裸指针)
更高效(少拷贝)
更易读(少模板噪音)
本篇聚焦:语言级基础改进
二、auto:让编译器做它最擅长的事
1.auto 解决了什么问题?
在模板和 STL 时代,类型往往又长又难写:
std::vector<std::map<int, std::string>>::iterator it = v.begin();
可读性极差,维护成本高。
2.auto 的正确用法
auto it = v.begin();
优点:
-
提升可读性
-
减少类型错误
-
配合模板极其友好
3.auto 的边界(高质量代码必须知道)
不推荐:
auto a = 1; // 类型语义不清
推荐:
auto it = container.begin();
auto lambda = [](int x) { return x * 2; };
经验法则:
当类型显而易见、或冗长难写时,使用 auto
三、nullptr:彻底告别“指针陷阱”
1.NULL 的历史问题
void func(int);
void func(int*);
func(NULL); // 二义性
NULL 本质是 0 或 0L,不是指针类型。
2.nullptr 的本质
nullptr // 类型:std::nullptr_t
只表示“空指针”,不会被当作整数
3.正确实践
int* p = nullptr;
if (p == nullptr) {
// 明确的指针语义
}
现代 C++ 中,禁止使用 NULL
四、范围 for:让“遍历”回归本质
1.传统 for 的问题
for (int i = 0; i < v.size(); ++i) {
cout << v[i] << endl;
}
-
容易越界
-
与容器细节强耦合
2.C++11 范围 for
for (const auto& val : v) {
cout << val << endl;
}
优点:
-
更安全
-
更清晰
-
自动适配容器
3.什么时候用引用?
for (auto& val : v) {
val *= 2; // 修改元素
}
读:const auto& 写:auto&
五、enum class:真正类型安全的枚举
1.传统 enum 的隐患
enum Color { RED, GREEN };
enum Status { OK, FAIL };
Color c = OK; // 居然合法
作用域污染 + 隐式转换
2.enum class 的改进
enum class Color { Red, Green };
enum class Status { Ok, Fail };
Color c = Color::Red;
优点:
-
强类型
-
有作用域
-
不可隐式转换
3.推荐规范
所有新代码,禁止使用旧 enum
六、using:typedef 的现代替代方案
1.typedef 的局限
typedef std::map<int, std::string> MapType;
在模板场景下可读性差。
2.using 的优势
using MapType = std::map<int, std::string>;
可读性更强 支持模板别名
template<typename T>
using Vec = std::vector<T>;
七、constexpr:让“计算”发生在编译期
1.编译期常量的价值
-
提高性能
-
保证安全
-
减少魔法数
2.constexpr 示例
constexpr int square(int x) {
return x * x;
}
int arr[square(5)]; // 合法
能在编译期算的,不要留到运行期
八、本篇总结
这一篇你应该真正理解的是:
-
auto 是 可读性工具
-
nullptr 是 类型安全工具
-
范围 for 是 语义抽象
-
enum class 是 强类型设计
-
using / constexpr 是 现代工程能力
C++11 的核心不是“新”,而是“正确”


