C++八股文(基础知识篇2)

1. 什么是内联函数(inline)?

  • 定义:用inline关键字修饰的函数,建议编译器在调用处展开函数体,而不是进行常规的函数调用
  • 优点:消除函数调用开销(压栈、跳转、返回),提高执行效率,特别适合小型、频繁调用的函数
  • 缺点:代码膨胀,如果函数体较大或调用次数多,会增加可执行文件大小
  • 注意事项:inline只是建议,编译器可能忽略;递归函数、虚函数通常不会内联;类内定义的成员函数默认是inline
  • 使用场景:getter/setter、简单的数学运算、循环内的小函数

2. 如何定义和使用常量表达式(constexpr)?

  • 定义:C++11引入,表示值可以在编译期计算的常量表达式
  • constexpr变量constexpr int SIZE = 100; 必须用常量表达式初始化,可用于数组大小等需要编译期常量的地方
  • constexpr函数constexpr int square(int x) { return x * x; } 如果参数是常量,编译期求值;否则运行期执行
  • 与const区别:const只保证不可修改,constexpr保证编译期可求值。constexpr隐含const
  • C++14增强:constexpr函数可以包含多条语句、局部变量、循环等
  • 使用场景:性能优化、模板元编程、编译期计算

3. 类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)有什么区别?

  • static_cast:编译期检查的类型转换,用于基本类型转换、类层次结构中的上行转换(派生类→基类)、显式构造函数调用。不能去除const,不做运行期检查
  • dynamic_cast:运行期类型检查,用于类层次结构中的安全下行转换(基类→派生类)。要求基类有虚函数,转换失败返回nullptr(指针)或抛异常(引用)
  • const_cast:唯一能去除或添加const/volatile属性的转换。常用于调用非const函数但不想修改对象时
  • reinterpret_cast:最危险的转换,重新解释内存位模式,用于指针与整数、不同类型指针间转换。不做任何检查,完全依赖程序员
  • 使用原则:优先用static_cast,需要运行期检查用dynamic_cast,避免使用reinterpret_cast

4. typedef 和 using 有何区别?

  • 基本功能:都用于类型别名。typedef int* IntPtr;using IntPtr = int*; 等价
  • 语法清晰度:using语法更直观,特别是函数指针:using FuncPtr = void(*)(int); vs typedef void(*FuncPtr)(int);
  • 模板别名:using支持模板别名(C++11),typedef不支持。template<typename T> using Vec = std

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

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

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

全部评论
如何收藏
点赞 回复 分享
发布于 02-26 14:36 北京
点赞 回复 分享
发布于 02-03 09:10 上海

相关推荐

评论
2
2
分享

创作者周榜

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