小马智行C++ 一面

1. C++ 中左值、右值、右值引用分别是什么?

  • 左值一般表示有名字、可取地址、生命周期相对明确的对象;右值通常是临时对象、字面量,或者表达式计算后的中间结果。
  • 右值引用本质上是为了高效接管临时对象资源,避免不必要的深拷贝,这也是移动语义成立的基础。
  • std::move 本身不移动对象,它只是把对象强制转换成右值引用,真正是否发生资源转移取决于移动构造或移动赋值是否实现。
  • 在工程里,右值引用常用于容器扩容、返回值优化配合、资源句柄转移等性能敏感场景。

2. 什么情况下需要把析构函数写成虚函数?

  • 只要一个类可能被当作基类使用,并且会通过基类指针删除派生类对象,就必须把析构函数声明为虚函数。
  • 如果基类析构不是虚函数,delete basePtr 时只会调用基类析构,派生类资源无法正确释放,容易造成资源泄漏。
  • 虚析构函数保证对象销毁时会按派生类到基类的顺序完整调用析构链。
  • 如果一个类明确不会被继承,或者不会通过基类指针释放对象,那么不一定需要虚析构。

3. 深拷贝和浅拷贝有什么区别?

  • 浅拷贝只是复制对象成员的值,如果成员里有指针,那么复制后两个对象可能指向同一块堆内存。
  • 深拷贝会额外申请新资源,把原对象内容完整复制过去,这样两个对象彼此独立,互不影响。
  • 如果类内部管理动态资源,只依赖编译器生成的默认拷贝构造和赋值运算符,往往会引发重复释放、悬空指针等问题。
  • 这类场景通常要自己实现拷贝控制,或者直接使用 std::stringstd::vector、智能指针等 RAII 类型来规避手写资源管理。

4. newmalloc 的区别是什么?

  • malloc 是 C 风格内存分配函数,只负责按字节申请内存,不会调用构造函数;new 是 C++ 运算符,既分配内存也会执行对象构造。
  • malloc 返回 void*,需要手动类型转换;new 返回对应类型指针,类型更安全。
  • 释放时也必须成对使用,malloc/free 一组,new/delete 一组,混用会导致未定义行为。
  • 对于对象创建,尤其是有构造、析构逻辑的类,优先使用 new 或更现代的智能指针和容器。

5. const 可以修饰哪些位置?分别有什么意义?

  • 修饰变量时,表示该变量初始化后不能被修改,例如 const int a = 10;
  • 修饰指针时需要区分两种情况:const int* p 表示不能通过 p 改值;int* const p 表示指针自身不能改指向。
  • 修饰成员函数时,表示该函数不会修改对象的非 mutable 成员,因此可以被常对象调用。
  • 在接口设计中,合理使用 const 能提高可读性,明确只读语义,也有助于编译器做更多检查。

6. vector 扩容时会发生什么?

  • vector 当前容量不足以容纳新元素时,会重新申请一块更大的连续内存,然后把旧元素搬迁过去。
  • 搬迁过程通常优先调用移动构造,如果类型不支持移动才会退化成拷贝构造,因此现代 C++ 类型设计会尽量支持移动语义。
  • 扩容后,原来的迭代器、指针、引用大概率都会失效,这是面试和工程里都非常高频的坑点。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

04-14 15:35
吉林大学 C++
首先上来自我介绍然后30分钟基本都是在聊项目本来项目聊的没什么问题,也就是正常深挖嘛然后突然就开始不对劲了,因为我有个项目是小组项目,然后面试官一直问其他组员负责的事情,我没有涉及到那个模块。然后我向面试官说明了这个地方不是我负责的,所以我不太清楚。然后不知道为什么他一直问这个问题,就很纠结。导致我只能一直解释加描述我负责的模块。然后突然开始问,你有没有考研(没考),你是一直在找工作吗,为什么到现在都没签工作。(我说我手上已有意向,在尝试看更好的机会)我顿时就很无语了,我见过问你手上有没有offer的,直接来句你为什么现在还在找工作(为什么到现在还没签工作)然后我就和面试官类似于吵起来(刚开始也没真吵),就是说明我的情况,我就说我不知道是因为岗位不匹配还是什么原因,感觉面试官您很不尊重我,无论是从刚刚问项目一直问其他的问题(我已经解释了,您要是觉得能力不行你直接不问挂了呗),而且面试官也没开摄像头。(因为我面的大部分面试官都开,而且不开也基本会说一下原因嘛,本来我觉得没什么的,也不是什么大事)然后面试官就很大声说什么我太敏感了,然后他又聊了下之前项目问到的问题,然后还问了下你这个项目结果怎么样。因为是个比赛项目,排名前50%。他直接来了句:“前50%!呵!”(就那种很难听很嘲讽人的话)。然后他还解释开摄像头,说什么面试人太多太花时间了。我也懒得跟他多说什么,我也呵了一声,我就说您觉得我不行那就算了,没必要一直这么刻薄我。他还没等我话说完:”你的面试已经结束了!你的面试已经结束了!“总结:这家公司好不好我不清楚,纯个人评判,面试基本只问项目,可能有压力面,但面试官说话很难听,有种挖苦的感觉。就是那种你不会也好,你没负责也好,也要一直故意死纠结问你。我寻思都说不清楚了,您要是觉得我不行就跳过呗。感觉有种面试就是故意来对面试者项目挑刺的,故意让你难受的。补充:可能会觉得我不应该反驳面试官,我这也是第一次这种情况。实在是感觉有点太不尊重人了,具体内容细节没详细描述,大致是这个情况,我最开始一直都是好声好气的跟面试官尽可能沟通。最后那句”你为什么现在都没签工作“我实在是受不了了。有一种很嘲讽的语气,还有对我项目成果来句呵!(很尖锐的一声)面试是个双向选择的过程,大家都应该互相尊重对方,哪怕你觉得对方能力不行,你也可以敷衍了事后续挂掉(就kpi面那种),没必要这样刻薄人吧。以上评价只针对该公司给我面试的面试官,不带有任何评价该公司的主观因素。谨慎参考!!!
Zedpzzz:真的是 吃到红利的人在踩头,什么人都当面试官了
查看6道真题和解析
点赞 评论 收藏
分享
04-17 23:48
西北大学 Java
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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