C++ 新特性 常考面试题总结
1. 说说C++11的新特性有哪些
核心分为四大类,覆盖语言语法、性能优化、并发编程:
- 内存管理:智能指针(unique_ptr/shared_ptr/weak_ptr);
- 值语义优化:右值引用、移动语义、完美转发;
- 语法简化:auto类型推导、Lambda表达式、范围for循环;
- 模板与类型:可变参数模板、nullptr、四种类型转换、constexpr;
- 并发编程:线程库(std::thread)、互斥锁(std::mutex)、条件变量;
- 容器优化:std::array、std::unordered_map、emplace系列函数。
2 简述C++右值引用与转移语义
- 右值引用:专门引用右值(临时对象、将要销毁的对象),语法为T&&,与左值引用(T&)区分,避免对临时对象的拷贝;
- 转移语义:基于右值引用实现,将对象的资源(如堆内存、文件句柄)从一个对象“转移”到另一个对象,而非拷贝,大幅降低性能开销;
- 核心场景:容器emplace_back、智能指针移动、临时对象传参,替代无意义的深拷贝。
3. 简述一下C++11中四种类型转换
C++11推荐使用强类型转换替代C风格强制转换,分为四类,各司其职:
- static_cast:静态转换,用于基础类型、父子类向上转换、隐式类型的显式化,编译期检查,最常用;
- dynamic_cast:动态转换,仅用于父子类向下转换,运行期通过RTTI检查类型合法性,失败返回nullptr(指针)或抛异常(引用);
- const_cast:去除/添加const属性,仅能修改指针/引用的const限定,不能直接转换对象;
- reinterpret_cast:重解释转换,强制转换二进制位,如指针转整数、不同类型指针互转,风险最高,仅用于底层开发。
4. 简述一下C++11中auto的具体用法
auto用于编译期类型推导,核心用法:
- 简化变量定义:auto i = 10;(推导为int)、auto ptr = make_shared<int>(5);(推导为shared_ptr<int>);
- 迭代器遍历:for (auto it = vec.begin(); it != vec.end(); ++it),避免冗长的迭代器类型;
- 配合Lambda表达式:auto add = [](int a, int b) { return a + b; },Lambda类型匿名,必须用auto接收;
- 注意事项:auto不能用于函数参数、类成员变量,推导时会忽略顶层const和引用。
5 简述一下C++11中的可变参数模板新特性
可变参数模板允许模板接收数量不确定、类型不确定的参数,核心用于泛型编程:
- 语法:模板参数包template <typename... Args>,函数参数包void func(Args... args);
- 核心操作:通过递归展开或逗号表达式展开参数包;
- 典型应用:std::make_shared、std::tuple、日志库的可变参数打印函数。
6 简述一下C++11中Lambda新特性
Lambda是匿名函数对象,用于定义临时函数逻辑,核心语法与特性:
- 语法:[捕获列表](参数列表) -> 返回值类型 { 函数体 },返回值可省略(编译器自动推导);
- 捕获列表:[=]值捕获、[&]引用捕获、[this]捕获当前对象、[a, &b]混合捕获;
- 核心优势:就地定义逻辑,避免定义全局函数/仿函数,配合STL算法(如std::sort)使用极便捷;
- 本质:编译器将Lambda编译为匿名仿函数类,捕获列表对应类成员变量。
7. 说说C++中智能指针和指针的区别是什么?
8. 说说C++中的智能指针有哪些?分别解决的问题以及区别?
C++11核心提供三种智能指针,核心解决裸指针的内存管理问题:
- std::unique_ptr:独占所有权,不可拷贝,仅可移动;解决资源独占问题,无额外性能开销,适合局部对象、返回值传递;
- std::shared_ptr:共享所有权,通过引用计数管理;解决多对象共享资源问题,有引用计数原子操作开销;
- std::weak_ptr:弱引用,不增加引用计数;解决shared_ptr循环引用问题,仅用于观察资源,需通过lock()转为shared_ptr使用。
9. 简述C++中智能指针的特点
- RAII机制:资源获取即初始化,将资源生命周期与智能指针对象绑定;
- 自动释放:析构时自动调用删除器,释放资源,无需手动管理;
- 类型安全:与裸指针类型匹配,支持解引用、箭头访问,用法与裸指针一致;
- 可定制删除器:支持自定义删除器,适配非堆资源(如文件句柄、线程句柄)。
10 weak_ptr能不能知道对象计数为0,为什么?
不能。
- weak_ptr不持有对象所有权,仅存储指向控制块的指针,控制块中包含引用计数和弱引用计数;
- 当shared_ptr的引用计数为0时,对象会被销毁,但控制块会保留,直到weak_ptr的弱引用计数也为0时才释放;
- weak_ptr可通过expired()判断对象是否已销毁,而非直接获取引用计数。
11. weak_ptr如何解决shared_ptr的循环引用问题?
- 循环引用场景:A的shared_ptr指向B,B的shared_ptr指向A,双方引用计数互锁,永远无法归0,导致内存泄漏;
- 解决方法:将其中一方的shared_ptr改为weak_ptr;
- 核心逻辑:weak_ptr不增加引用计数,当外部shared_ptr释放后,A/B的引用计数可归0,对象正常析构;访问时通过weak_ptr::lock()获取shared_ptr,安全访问对象。
12. 说说智能指针及其实现,shared_ptr线
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.
查看3道真题和解析