C++八股文(编译与链接)

1. 头文件和源文件如何组织?

头文件 (.h/.hpp) 的职责:

  • 类的声明
  • 函数原型
  • 常量定义
  • 模板定义
  • 内联函数定义

源文件 (.cpp/.cc) 的职责:

  • 函数的具体实现
  • 类成员函数的实现
  • 全局变量的定义
  • 静态变量的定义

组织原则:

  • 一个类对应一对 .h 和 .cpp 文件
  • 头文件使用 include guard 或 #pragma once 防止重复包含
  • 头文件只放声明,源文件放实现
  • 能用前置声明就不要 include 完整头文件
  • 修改源文件不会触发依赖该头文件的其他文件重新编译

2. #define 和 const 有什么区别?

处理阶段:

  • #define 在预处理阶段进行文本替换,编译器看不到宏名
  • const 在编译阶段处理,有类型检查

类型安全:

  • #define 没有类型,只是文本替换
  • const 有明确类型,编译器会进行类型检查

作用域:

  • #define 没有作用域概念,定义后全局生效
  • const 有作用域限制,可以是局部或全局

调试:

  • #define 调试时只能看到替换后的值
  • const 调试器可以显示变量名和值

内存:

  • #define 不占用内存空间
  • const 占用内存空间(可能被编译器优化)

3. inline 函数和宏有什么区别?

宏的特点:

  • 简单的文本替换,没有语法检查
  • 容易产生副作用,如 #define SQUARE(x) x*x 调用 SQUARE(a+1) 会展开为 a+1*a+1
  • 没有类型检查
  • 无法调试,不能设置断点
  • 不遵守作用域规则

inline 函数的特点:

  • 真正的函数,有完整的类型检查
  • 不会有宏的副作用问题
  • 可以设置断点调试
  • 遵守作用域和访问控制规则
  • 可以作为类成员函数
  • inline 只是建议,编译器决定是否真正内联

性能:

  • 两者都旨在减少函数调用开销
  • 复杂函数即使声明 inline 也可能不会内联
  • 现代编译器会自动优化,不必过度使用 inline

4. 如何使用命名空间避免名称冲突?

命名空间的作用:

  • 组织代码,将相关功能逻辑分组
  • 避免全局命名空间污染
  • 解决不同库之间的同名问题
  • 提供代码的逻辑层次结构

使用方式:

  1. 完全限定名:std::vector<int> v; 明确指定命名空间
  2. using 声明:using std::cout; 引入特定名称
  3. using 指令:using namespace std; 引入整个命名空间
  4. 嵌套命名空间:namespace company::project::module 创建层次结构
  5. 匿名命名空间: 限制符号在当前文件内可见,替代 static

注意事项:

  • 头文件中避免 using namespace,防止污染包含该头文件的代码
  • 源文件中可以适度使用 using 声明
  • 为项目创建独特的命名空间,避免与标准库或第三方库冲突

5. 静态链接与动态链接有何区别?

静态链接:

  • 编译时将库代码复制到可执行文件中
  • 可执行文件体积大,但独立运行
  • 不依赖外部库文件,部署简单
  • 库更新需要重新编译整个程序
  • 多个程序使用同一库会占用更多磁盘和内存

动态链接:

  • 运行时加载共享库(.dll/.so)
  • 可执行文件体积小
  • 多个程序共享库代码,节省内存和磁盘空间
  • 库更新后无需重新编译程序
  • 需要确保运行环境有正确版本的库

选择依据:

  • 独立部署、避免依赖问题:静态链接
  • 节省空间、方便更新:动态链接
  • 性能敏感场景:静态链接略快
  • 插件系统、模块化设计:动态链接

6. 如何调试链接错误

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

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

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

全部评论

相关推荐

一面(1.7&nbsp;5.00&nbsp;38min)基础/项目类1.&nbsp;自我介绍,主要介绍项目经验2.&nbsp;性能优化是PC端还是移动端的?3.&nbsp;性能优化过程中主要做了什么事情?做完之后有什么收益?4.&nbsp;现在写代码基本上是让AI帮你生成还是自己写?React原理类5.&nbsp;useMemo、useCallback、React.memo的区别,以及在什么场景下使用?6.&nbsp;Fiber架构是怎么实现可中断渲染的?7.&nbsp;可中断渲染对React应用有什么意义或优势?8.&nbsp;Hooks的实现原理是什么?9.&nbsp;为什么Hooks必须在函数组件顶层调用,不能写在条件语句中?手写代码类10.&nbsp;手写倒计时组件(原生JS,不用React)11.&nbsp;两个数组合并+去重+排序(不用API,原生JS实现)其他类12.&nbsp;对AI有什么学习、使用或项目经验?13.&nbsp;对机器学习/小模型感兴趣吗?14.&nbsp;实习到岗时间和实习时长?3个小时约二面二面(1.8&nbsp;2.00&nbsp;47min)体验感非常好,无八股无手写项目深挖&nbsp;-&nbsp;macOS策略配置1.&nbsp;你做的工具是给谁用的?业务场景是什么?2.&nbsp;DSL是你设计的还是谁设计的?3.&nbsp;DSL能看一下吗?是JSON还是JS?4.&nbsp;能改成JSON吗?(追问)5.&nbsp;有了解过类似的DSL或者别人怎么做这样的事情吗?6.&nbsp;有了解formily这种动态表单的实现机制吗?项目深挖&nbsp;-&nbsp;类ChatGPT项目1.&nbsp;图文多模态/生成图片是你自己做的吗?2.&nbsp;你怎么去拿图片并保存到自己的磁盘?3.&nbsp;这个过程中有碰到什么比较难解决的问题吗?4.&nbsp;(关键追问)图片抖动的根源是什么?你怎么解决的?AI编程相关1.&nbsp;有通过AI来帮你解决问题吗?2.&nbsp;AI写的代码准确率高吗?你做了什么事情提高准确率?3.&nbsp;有没有了解什么工具能基于代码仓库生成Spec文件?监控SDK1.&nbsp;监控SDK是干什么用的?2.&nbsp;有了解过业内有哪家公司做过这样的监控吗?3个小时OC27个小时offer总结:今天多刷两个小时快手。
查看29道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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