C++ 新特性 常考面试题总结

1. 说说C++11的新特性有哪些

核心分为四大类,覆盖语言语法、性能优化、并发编程:

  1. 内存管理:智能指针(unique_ptr/shared_ptr/weak_ptr);
  2. 值语义优化:右值引用、移动语义、完美转发;
  3. 语法简化:auto类型推导、Lambda表达式、范围for循环;
  4. 模板与类型:可变参数模板、nullptr、四种类型转换、constexpr;
  5. 并发编程:线程库(std::thread)、互斥锁(std::mutex)、条件变量;
  6. 容器优化:std::array、std::unordered_map、emplace系列函数。

2 简述C++右值引用与转移语义

  • 右值引用:专门引用右值(临时对象、将要销毁的对象),语法为T&&,与左值引用(T&)区分,避免对临时对象的拷贝;
  • 转移语义:基于右值引用实现,将对象的资源(如堆内存、文件句柄)从一个对象“转移”到另一个对象,而非拷贝,大幅降低性能开销;
  • 核心场景:容器emplace_back、智能指针移动、临时对象传参,替代无意义的深拷贝。

3. 简述一下C++11中四种类型转换

C++11推荐使用强类型转换替代C风格强制转换,分为四类,各司其职:

  1. static_cast:静态转换,用于基础类型、父子类向上转换、隐式类型的显式化,编译期检查,最常用;
  2. dynamic_cast:动态转换,仅用于父子类向下转换,运行期通过RTTI检查类型合法性,失败返回nullptr(指针)或抛异常(引用);
  3. const_cast:去除/添加const属性,仅能修改指针/引用的const限定,不能直接转换对象;
  4. reinterpret_cast:重解释转换,强制转换二进制位,如指针转整数、不同类型指针互转,风险最高,仅用于底层开发。

4. 简述一下C++11中auto的具体用法

auto用于编译期类型推导,核心用法:

  1. 简化变量定义:auto i = 10;(推导为int)、auto ptr = make_shared<int>(5);(推导为shared_ptr<int>);
  2. 迭代器遍历:for (auto it = vec.begin(); it != vec.end(); ++it),避免冗长的迭代器类型;
  3. 配合Lambda表达式:auto add = [](int a, int b) { return a + b; },Lambda类型匿名,必须用auto接收;
  4. 注意事项:auto不能用于函数参数、类成员变量,推导时会忽略顶层const和引用。

5 简述一下C++11中的可变参数模板新特性

可变参数模板允许模板接收数量不确定、类型不确定的参数,核心用于泛型编程:

  1. 语法:模板参数包template <typename... Args>,函数参数包void func(Args... args);
  2. 核心操作:通过递归展开或逗号表达式展开参数包;
  3. 典型应用:std::make_shared、std::tuple、日志库的可变参数打印函数。

6 简述一下C++11中Lambda新特性

Lambda是匿名函数对象,用于定义临时函数逻辑,核心语法与特性:

  1. 语法:[捕获列表](参数列表) -> 返回值类型 { 函数体 },返回值可省略(编译器自动推导);
  2. 捕获列表:[=]值捕获、[&]引用捕获、[this]捕获当前对象、[a, &b]混合捕获;
  3. 核心优势:就地定义逻辑,避免定义全局函数/仿函数,配合STL算法(如std::sort)使用极便捷;
  4. 本质:编译器将Lambda编译为匿名仿函数类,捕获列表对应类成员变量。

7. 说说C++中智能指针和指针的区别是什么?

8. 说说C++中的智能指针有哪些?分别解决的问题以及区别?

C++11核心提供三种智能指针,核心解决裸指针的内存管理问题:

  1. std::unique_ptr:独占所有权,不可拷贝,仅可移动;解决资源独占问题,无额外性能开销,适合局部对象、返回值传递;
  2. std::shared_ptr:共享所有权,通过引用计数管理;解决多对象共享资源问题,有引用计数原子操作开销;
  3. std::weak_ptr:弱引用,不增加引用计数;解决shared_ptr循环引用问题,仅用于观察资源,需通过lock()转为shared_ptr使用。

9. 简述C++中智能指针的特点

  1. RAII机制:资源获取即初始化,将资源生命周期与智能指针对象绑定;
  2. 自动释放:析构时自动调用删除器,释放资源,无需手动管理;
  3. 类型安全:与裸指针类型匹配,支持解引用、箭头访问,用法与裸指针一致;
  4. 可定制删除器:支持自定义删除器,适配非堆资源(如文件句柄、线程句柄)。

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++工程能力.

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务