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);vstypedef void(*FuncPtr)(int); - 模板别名:using支持模板别名(C++11),typedef不支持。
template<typename T> using Vec = std
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。