C++ 常见语法面试题复习手册
Published:
0x01 基础语法与语言特性
static 变量的作用
- 函数内:生命周期扩展至程序结束,作用域仅限函数。
- 类内:类变量,所有实例共享。
- 文件作用域:限制符号仅在当前编译单元可见。
const 和 #define 定义的区别
const:类型安全,编译期常量,有作用域。#define:预处理阶段替换,无类型检查。
引用 vs 指针的区别
- 引用不可为 null,不可重绑定,更安全。
- 指针可为 null,可重新赋值。
namespace 命名空间的使用
- 作用:防止命名冲突。
- 推荐使用别名或在函数内局部使用
using。
Cpp 与 C 语言类型转换
- C 风格:
(int)x(不推荐) - C++ 风格:
static_cast,dynamic_cast,const_cast,reinterpret_cast
auto 变量类型推导
- 自动根据初始化推导类型。
- 无法用作函数参数类型。
decltype 推导表达式类型
decltype(expr)不会计算expr,仅提取其类型。
0x02 面向对象相关功能
struct 和 class 的区别
struct默认 public,class默认 private。- 用法一致,语义上
struct常用于数据结构。
构造函数类型
- 默认构造:无参或默认值。
- 拷贝构造:值传递或返回。
- 移动构造:转移资源(
T&&+std::move)。
虚析构函数
- 必须为虚,确保 delete 派生类时调用完整析构流程。
多继承 & 虚继承
- 多继承可能产生菱形继承问题。
- 虚继承使用
virtual保证共享唯一基类实例。
虚函数 和 vtable 的区别
- 虚函数:支持运行时多态
vtable:每个多态类对象通过vptr访问虚函数表
OverLoad 和 Override 的区别
- 重载(overload):同作用域、同名、不同参数
- 重写(override):继承中重新定义虚函数,签名必须完全匹配
抽象类 & 纯虚函数
- 抽象类不能实例化,用作接口。
virtual void foo() = 0;
0x03 高级语法特性
模板
- 支持泛型编程。
- 特化:为特定类型提供不同实现。
智能指针
unique_ptr:独占所有权,不能拷贝。shared_ptr:引用计数。weak_ptr:观察者,解决循环引用问题。
右值引用 & 移动语义
T&&:绑定右值对象。std::move(x):将变量转换为右值引用,允许移动。
Lambda 表达式
[=] 捕获全部外部变量(值)
[&] 捕获全部外部变量(引用)
[x, &y] 捕获特定变量
[this] 捕获当前对象
STL 容器
vector:动态数组,随机访问快list:双向链表,插入删除快,访问慢map:红黑树unordered_map:哈希表
异常处理
try {
throw ...;
} catch (...) {
...
}
//noexcept: 声明函数不抛异常,可优化性能。
多线程与同步
std::thread t(func);
t.join();
std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
