C++11新特性面试题
1. C++11引入了哪些重要特性?
答案:
- 语言核心特性auto类型推导decltype类型推导nullptr空指针范围for循环lambda表达式右值引用和移动语义变参模板constexpr常量表达式
- 标准库智能指针(shared_ptr、unique_ptr、weak_ptr)线程库(thread、mutex、condition_variable)正则表达式时间库(chrono)随机数库元组(tuple)
- 容器unordered_map、unordered_setarrayforward_list
2. auto关键字的作用和使用场景?
答案:
- 作用自动类型推导编译器根据初始化表达式推导类型必须初始化
- 使用场景
// 简化复杂类型
auto it = map.begin(); // 代替 map<int,string>::iterator
// 模板类型
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
// 范围for循环
for (auto& elem : vec) {
// ...
}
// lambda表达式
auto lambda = [](int x) { return x * 2; };
- 注意事项auto会丢弃const和引用使用const auto&保留const和引用不能用于函数参数(C++14后可以)不能用于数组
3. lambda表达式的语法和使用?
答案:
- 基本语法
[捕获列表](参数列表) -> 返回类型 { 函数体 }
- 捕获方式[]:不捕获[=]:值捕获所有[&]:引用捕获所有[x]:值捕获x[&x]:引用捕获x[this]:捕获this指针[=, &x]:x引用捕获,其他值捕获
- 使用示例
// 简单lambda
auto add = [](int a, int b) { return a + b; };
// 捕获外部变量
int factor = 2;
auto multiply = [factor](int x) { return x * factor; };
// 用于STL算法
vector<int> v = {3, 1, 4, 1, 5};
sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
// 可变lambda
int count = 0;
auto counter = [count]() mutable { return ++count; };
- 优势代码简洁就地定义可以捕获局部变量
4. 右值引用和移动语义是什么?
答案:
- 右值引用用&&声明:int&& rref = 10;绑定到临时对象延长临时对象生命周期
- 移动语义转移资源所有权,而非拷贝避免不必要的深拷贝提高性能
- 移动构造函数
class MyString {
char* data;
public:
// 移动构造
MyString(MyString&& other) noexcept
: data(other.data) {
other.data = nullptr;
}
// 移动赋值
MyString& operator=(MyString&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
other.data = nullptr;
}
return *this;
}
};
- std::move将左值转换为右值引用不移动任何东西,只是类型转换
string s1 = "hello"; string s2 = std::move(s1); // s1被移动,不
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

查看8道真题和解析