# C++11 新特性全景
面试官问:"C++11 有哪些重要的新特性?你觉得最核心的改进是什么?"
这题看似简单,实际上考的是你对 C++11 的理解深度。很多人能列出十几个特性名字,但说不清这些特性之间的关系、为什么要引入、解决了什么问题。关键是从设计动机出发,把零散的特性串成体系。
# 简要回答
C++11 是现代 C++ 的分水岭,所有新特性围绕三个核心目标展开:
- 性能优化:右值引用、移动语义、constexpr——减少不必要的拷贝,把能在编译期做的事提前做
- 安全性提升:智能指针、nullptr、强类型枚举、static_assert——从语言层面堵住 C++ 的经典坑
- 表达力增强:auto、Lambda、范围 for、初始化列表、变参模板——让代码更简洁、意图更明确
# 详细回答
性能优化:右值引用与移动语义
C++11 之前,函数返回大对象、容器插入临时对象,都要经历一次深拷贝。右值引用(T&&)让编译器能识别"即将销毁的临时对象",直接"偷走"它的资源而不是复制一份。配合 std::move,程序员可以显式触发移动而非拷贝。
constexpr 则是另一个方向的优化——把能在编译期算出来的值提前算好,运行时零开销。
安全性提升:智能指针与类型安全
unique_ptr、shared_ptr、weak_ptr 三种智能指针用 RAII 管理堆内存,从根本上解决忘记 delete、重复 delete、悬空指针三大问题。nullptr 替代了类型不安全的 NULL(本质是整数 0)。enum class 解决了传统枚举的命名污染和隐式转换问题。static_assert 让错误在编译期就暴露。
表达力增强:auto 与 Lambda
auto 让编译器推导类型,省去写复杂迭代器类型的痛苦。decltype 则用于获取表达式的精确类型,常用于模板编程。Lambda 表达式让"就地定义一个小函数"成为可能,配合 STL 算法使用极其方便。范围 for 循环简化了容器遍历。初始化列表 {} 统一了各种初始化语法。变参模板让泛型编程能处理任意数量的参数。
并发支持:多线程库
C++11 之前,多线程只能依赖平台 API(pthread、Windows API)。C++11 引入了 std::thread、std::mutex、std::condition_variable、std::atomic 等标准组件,让并发代码可以跨平台。

# 知识拓展
面试官可能追问:
Q1: auto 和 decltype 有什么区别?
auto 用于变量声明,让编译器从初始化表达式推导类型,会忽略顶层 const 和引用。decltype 用于获取表达式的精确类型,保留 const 和引用。典型场景:auto 简化日常代码,decltype 用在模板返回值推导等需要精确类型的地方。
Q2: 右值引用为什么能提升性能?
因为它让编译器区分"还要继续用的对象"和"马上就要销毁的临时对象"。对临时对象,移动构造函数直接接管它的内部资源(比如把 vector 内部的指针偷过来),而不是分配新内存再逐元素拷贝。代价从 O(n) 降到 O(1)。
Q3: unique_ptr、shared_ptr、weak_ptr 怎么选?
独占所有权用 unique_ptr,零额外开销,是默认选择。需要共享所有权时用 shared_ptr,有引用计数的开销。weak_ptr 配合 shared_ptr 使用,解决循环引用问题——它观察但不拥有对象。
Q4: Lambda 的捕获列表有什么讲究?
[=] 按值捕获所有外部变量,[&] 按引用捕获。按值捕获安全但有拷贝开销,按引用捕获零开销但要注意生命周期——如果 Lambda 比被捕获的变量活得久,引用就悬空了。实践中推荐显式列出要捕获的变量,意图更清晰。
← 如何避免内存碎片 C++11中的多线程编程 →
评论
验证登录状态...