c++ 面试总结(1)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

1. 编译过程

回答
C/C++的编译分为四个阶段:

  1. 预处理:处理#include#define等指令,生成.i文件。
  2. 编译:将预处理后的代码转换为汇编代码(.s文件)。
  3. 汇编:将汇编代码转为机器码(目标文件.o)。
  4. 链接:合并目标文件和库,解析符号引用,生成可执行文件。

解析

  • 预处理阶段会删除注释,展开宏和头文件。
  • 编译阶段进行语法和语义检查,生成中间代码(如LLVM IR)。
  • 链接分为静态链接(直接合并库代码)和动态链接(运行时加载)。
  • 扩展:使用gcc -save-temps可保留所有中间文件,便于调试。

2. enumenum class

回答

  • 传统enum
    • 成员直接暴露在父作用域,可能引发命名冲突。
    • 隐式转换为整型(如int a = Color::RED)。
  • enum class(C++11)
    • 成员需通过作用域访问(Color::RED)。
    • 禁止隐式类型转换,需显式static_cast

解析

  • enum class类型安全,避免隐式转换错误。
  • 扩展:可以为enum class指定底层类型(enum class Color : uint8_t)。

3. enumunion

回答

  • enum:定义一组整型常量,用于提高代码可读性。
  • union:所有成员共享同一块内存,用于节省内存(如协议解析)。

解析

  • union的大小由最大成员决定,同时只能有一个成员有效。
  • 风险:错误访问union成员可能导致未定义行为。
  • 扩展:C++中可用variant(C++17)替代union,提供类型安全。

4. 类型转换

回答:C++支持四种显式转换:

  1. static_cast:基本类型转换、父子类指针转换(无运行时检查)。
  2. dynamic_cast:多态类型向下转换(依赖RTTI,失败返回nullptr)。
  3. const_cast:移除constvolatile属性(慎用)。
  4. reinterpret_cast:低级别指针转换(如int*char*)。

解析

  • 避免C风格强制转换(如(int*)p),优先使用C++风格。
  • 扩展dynamic_cast只能用于含虚函数的类(多态类型)。

5. 右值引用

回答

  • 右值:临时对象(如函数返回值、表达式结果)。
  • 右值引用(&&:用于移动语义(转移资源)和完美转发。
  • std::move:将左值强制转为右值引用。

解析

  • 移动语义:避免深拷贝,提升性能(如vector的移动构造)。
  • 扩展完美转发通过std::forward保留参数的左/右值属性。

6. C11特性

回答:常用C11特性:

  • 多线程支持<threads.h>提供线程、互斥量接口。
  • 泛型选择_Generic根据类型选择代码分支。
  • 匿名结构体/联合:简化嵌套定义。

解析

  • C11的多线程库在功能上弱于C++的<thread>,但跨平台兼容性好。
  • 扩展:C11新增_Static_assert用于编译期断言。

7. 重写(Override)与重载(Overload)

回答

  • 重载:同一作用域内同名函数,参数不同(返回类型无关)。
  • 重写:派生类覆盖基类的虚函数(需virtualoverride)。

解析

  • override关键字(C++11)明确表示重写,避免拼写错误。
  • 扩展:函数隐藏(无virtual时)可能导致非预期的调用结果。

8. 野指针及避免方法

回答

  • 野指针:指向已释放内存或未初始化内存的指针。
  • 避免方法
    1. 初始化指针为nullptr
    2. 释放后立即置空。
    3. 使用智能指针(unique_ptrshared_ptr)。

解析

  • shared_ptr可能引发循环引用,需配合weak_ptr使用。
  • 扩展:工具检测(如Valgrind、ASan)可定位野指针问题。

9. 命名空间冲突

回答

  • 解决方式
    1. 使用命名空间隔离代码(namespace MyLib { ... })。
    2. 匿名命名空间限制作用域(仅当前文件可见)。

解析

  • using namespace std;可能导致标准库符号冲突。
  • 扩展:内联命名空间(C++11)用于版本控制。

10. 宏定义作用范围

回答

  • 宏从定义处生效,直到文件末尾或#undef取消定义。
  • 不受命名空间或代码块限制。

解析

  • 宏可能引发意外替换(如#define min(a,b) ...)。
  • 扩展:优先使用constexpr(C++11)或内联函数替代宏。

11. 代码注释何时消失

回答
注释在预处理阶段被删除,编译器处理的代码中不包含注释。

解析

  • 预处理后的文件(.i)可通过gcc -E查看,确认注释已移除。

12. readelf分析ELF文件

回答

  • 常用命令
    1. 查看文件头:readelf -h <file>
    2. 查看节区头:readelf -S <file>
    3. 查看符号表:readelf -s <file>
    4. 查看动态段:readelf -d <file>

解析

  • 文件头:包含ELF类型(可执行、共享库)、入口地址等信息。
  • 符号表:用于定位未定义符号(如链接错误)。
  • 扩展:结合objdump反汇编(objdump -d)分析代码段。

总结:以上问题覆盖C++核心概念及底层原理,面试时需结合代码示例和实际场景解释,展现对技术的深入理解。

常见C++面试问题总结1 C++面试总结 【1】同步通信和异步通信的区别? 答: 1) 同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。 2) 同步通信效率高;异步通信效率低。 3) 同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。 【2】TCP协 阅读详情

相关推荐

C/C++面试1

C/C++面试题分享

dvlinker的技术专栏 7464

1小时搞定C++面试Demo:快速原型开发实战

快速原型开发的方法让我在准备面试时事半功倍。通过自动化生成代码框架、即时反馈和快速迭代,我能把更多精力放在算法优化和边界条件处理上,而不是浪费在环境配置上。如果你也在准备技术面试,不妨试试这种方法,相信会大大提升你的准备效率。

SnowflakeJaguar14的博客 673

用Cursor+Node.js零代码搭建健康数据仪表盘:从数据录入到可视化全流程

本文详细介绍了如何利用Cursor AI编程助手和Node.js,无需手动编写代码,即可构建个人健康数据仪表盘的全流程。通过自然语言指令,实现从数据录入、存储到动态图表可视化的完整系统,展示了AI驱动开发在降低技术门槛、提升开发效率方面的强大能力。

gitlab7runner的博客 677

1小时搭建C++面试模拟系统原型

上可以直接部署成可访问的终端应用,分享链接同事就能立即体验。后续准备加入更多题目类型和可视化统计,有了这个基础框架迭代起来会很轻松。对于需要快速验证想法的场景,这种开发方式确实高效。最近在准备技术分享时,突然想到如果能有个简单的C++面试模拟系统,现场演示起来会直观很多。快速搭建原型,没想到1小时就搞定了可运行的demo。记录下实现思路,给有类似需求的同学参考。- 用平台内置的C++环境直接调试,省去本地配置时间。- 终端交互通过简单循环就能实现,不需要复杂UI。最终生成包含正确率和时间分析的简单报告。

AmberLeopard26的博客 360

c++ 面试指南 1

二、C++面试

weixin_39354845的博客 1316

C++面试 1

http://zhedahht.blog.163.com/blog/static/254111742011012111557832/ 写在前面的话:由于与C++语法相关的面试题,通常用很短的篇幅就能解释清楚,不适合写博客,因此本博客一直没有关注C++的语法题。近期发现篇幅短的C++题目刚好合适微博,于是开始在微博http://weibo.com/zhedahht和http://t.163.com

miao6664659的专栏 575

C++ 面试基础1

1. int var[sizeof(unsigned int)]; 是否正确,为什么? 正确,sizeof是编译时运算符,在程序编译时就确定了其值,可以sizeof(unsigned int)看作是与机器相关的常量。 2.源文件中定义的静态全局变量(或者称静态外部变量)其作用域范围是? 源文件中定义的静态全局变量只在该源文件中有效,只能被该源文件内的函数使用,同一源程序中的其他源文件不能使用它,可...

北极星的博客 279

c++面试八股小记1

例如,全局变量或静态变量持有的内存。派生类在多继承时,由多个虚表指针,对某个基类虚函数重写时,对应基类的虚表中的虚函数指针会被更新,如果有新虚函数,会在第一个虚表后增加虚函数地址。保证全和稳定,将普通程序限制在了用户态下,不允许直接访问硬件和io等资源,限制了cpu的权限,避免了用户的误操作导致资源损坏。模板:写一些与类型无关的代码,编译器在编译时生成模板的带类型的实例,同时也确定了调用的具体代码。函数重载:函数名相同,参数列表不同(类型,数量,顺序),编译器根据提供的实参决定调用哪个函数。

weixin_62692110的博客 1252

const面试1.cpp

//[美国某著名计算机嵌入式公司2005面试题] //解析: //在C程序中,const的用法主要有定义常量、修饰函数参数、修饰函数返回值等3个用处。在C程序中,它还可以 //修饰函数的定义体,定义类中某个成员函数为恒态函数,即补改变类中的数据成员。 //答案:(1)可以定义const常量 (2)const可以修饰函数的参数和返回值,甚至函数的定义体。被const

Doraemon___的博客 477

C++面试问题总结1

以下是我收集到的一些关于C++面试常见的一些问题,用于各位正在准备面试的好兄弟们参考,有不正确的地方欢迎指正@-@。 问题一:继承和多态的区别? 继承:类与类之间可以共用代码,实现代码重用。 多态:子类重写父类的方法,使得子类具有不同的实现。且运行时,根据实际创建的对象动态决定使用哪个方法。 C++中实现多态的前提条件。1.有继承;2.重写父类方法 ;3.该方法要被virtual修饰; 4.父类指针或者引用指向子类对象 1.多态的实现要求必须是共有继承。 2.在继承

qq_55914897的博客 730

1.1 C++语言基础面试问题

预处理:展开宏,处理#include等预处理指令。编译:将C++源代码转换为汇编代码。汇编:将汇编代码转换为机器代码(目标文件)。链接:将目标文件和库文件合并,生成最终的可执行文件。函数指针 是一种指向函数的指针,它指向的是函数,而不是变量。通过函数指针,我们可以像调用普通函数一样调用指针所指向的函数。函数指针允许程序根据不同的需求动态选择要调用的函数,使代码更加灵活和模块化。通过函数指针,可以实现回调机制、动态函数调用、函数表、多态等功能,使得代码更加模块化和可扩展。

LIHONGLI000125的博客 1069

面试每日一题 Day 1 —— C++ vector 扩容机制

本文详细解析了C++中std::vector的扩容机制。当size等于capacity时,push_back等操作会触发扩容,不同编译器采用不同扩容因子(GCC/Clang为2倍,MSVC为1.5倍)。扩容过程包括申请新内存、迁移元素(C++11后优先移动构造)和释放旧内存。虽然单次扩容复杂度为O(n),但均摊分析表明n次push_back总时间为O(n),均摊到每次为O(1)。文章还提供了优化技巧(如reserve预分配)和常见面试问题解答,强调扩容会导致迭代器失效。

LeoJunp的博客 949

C++面试1

c++经典面试题——转载自https://blog.csdn.net/u013162035/article/details/78308140 面试1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但只能在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。  说明:很多时候一个变量,只...

zangba9624的博客 220

cpp新小点1以及部分面试笔试

C++ 中,子类重写(override)一个虚函数时,可以使用返回类型协变的特性,即返回派生类指针或引用。在使用基类指针或引用调用虚函数时,会根据运行时对象的实际类型动态调用相应的虚函数。由于派生类继承了基类的成员函数,因此可以在派生类中重写虚函数,并使用相同的函数名和参数列表,实现多态。但是,对于返回类型,一般情况下必须保持协变性,即返回类型要与基类的虚函数返回类型一致或是其派生类。Derived d;

MakeYouClimax的博客 764

C++面试速通宝典——1

面试速通宝典——1

小飞猪的博客 1955

c++面试题解(day1

最近准备c++面试掏出一堆视频,总结一些常见c++面试题,日常打卡。 一.预处理和宏定义的使用 1.预处理   //考点 :#ifdef  #else #endif   //例子: #include&lt;iostream&gt; uing namespace std; #define DEBUG //预处理常量 int main(){ #ifdef DEBUG;//判断是否定...

William辰的博客 1284

c++面试总结1

北京掌上飞鱼,做游戏,里面很多工大学长,学长对我挺照顾的,还给我规划了职业。。工资方面不比百度差。。 最好笑的,他们公司就在百度对面。。 虽然最后还是拒了人家,但是还是很喜欢这公司的。。 顺便给他们做个广告吧。。 主要面的是C++,过后总结下吧~~有些答案结合了网上的“标准答案”给出的。。嘻嘻,不是抄袭,是借鉴哦~~ 1.谈谈你对C++内存分配的理解

u012067392的专栏 297

C/C++面试题系列之3:输出1-N个数字

<br /> <br />题目:用C/C++计算1+2+3+……N<br />条件:<br />1.不使用任何循环语句。(for,while,goto等等)<br />2.不使用任何条件语句。(if,?:等等)<br />3.不使用*/等运算,只使用+-运算 <br />4:更不能写1000个printf或是cout。 <br /> <br />一看到这个题,人们会想到递归,但是递归需要结束条件,题目要去不要任何判断条件,所以不行。<br />例一:变相的用1000个printf<br />#include

Harry的专栏 2406

C++面试(1)

本文摘要: delete和free的区别:delete是操作符,用于释放new分配的空间,会调用析构函数;free是函数,用于释放malloc分配的空间,不会调用析构函数。 面向对象三大特征:封装(数据与操作结合)、继承(代码重用)、多态(运行时动态绑定)。 重载与重写的区别:重载是同一作用域同名函数参数不同;重写是派生类重新定义基类虚函数。 浅拷贝与深拷贝:浅拷贝仅复制指针值,可能导致重复释放;深拷贝会复制指针指向的内容。 虚函数实现原理:通过虚函数表和vptr指针实现动态绑定,支持多态。 纯虚函数:格式

2401_83191546的博客 764

C++ 面试1

muduo资料 1.函数指针和指针函数用法和区别 2. new/delete和malloc/free的底层实现 答: malloc与free是C++/c语言的标准库函数,new/delete是C++的运算符。 new 返回指定类型的指针,并且可以自动计算所需要大小;而 malloc返回的时void*,因此,malloc的返回值一般都需要进行类型转换; new/delete在...

weixin_30686845的博客 61
上一篇: 顺时针旋转矩阵
下一篇: C++核心知识点解析:多态、内存管理与智能指针
捏尼卜波卜
博客等级 码龄4年 156粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值