博主介绍:程序喵大人
- 35 - 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
- 更多原创精品文章,首发gzh,见文末
- 👇👇记得订阅专栏,以防走丢👇👇
😉C++基础系列专栏
😃C语言基础系列专栏
🤣C++大佬养成攻略专栏
🤓C++训练营
👉🏻个人网站
一个同学跟我说,他面了七八场,每场都被问到 C 和 C++ 的区别。
但问题是:问法不一样。有的问"区别是什么",有的问"为什么要分两种语言",有的问"什么场景用 C 什么场景用 C++"。
他发现,单纯背一个清单根本不够用。
这篇文章整理了 C/C++ 面试中最常被问到的 12 个问题,每个都给出面试级别的答案,不是背书,是能在面试官面前说出来的那种。
常见基础问题
Q1:C 和 C++ 最核心的区别是什么?
C 是过程式语言,程序 = 数据 + 函数。
C++ 是面向对象语言,程序 = 类 + 对象 + 消息。
底层上,C++ 编译器会把 class 翻译成 C 的 struct + 函数指针,但在语法层加了封装、继承、多态、运算符重载。
Q2:为什么 C++ 兼容 C 代码?
C++ 设计初衷之一就是"几乎完全兼容 C"。这是因为 C++ 的底层 ABI 在很多地方保持了一致,比如 struct 布局、函数调用约定(cdecl)。
但有些语法不兼容:C++ 的 class 关键字在 C 中不存在;C++ 有函数重载,C 没有。同一个 C++ 源文件如果用 C 编译器编译,函数重载会报错。
Q3:什么场景选 C,什么场景选 C++?
选 C 的场景:操作系统内核、嵌入式系统、驱动开发、运行时极小、不需要复杂抽象。
选 C++ 的场景:大型软件系统、游戏引擎、高性能服务器、需要复杂的抽象建模、需要 RAII 自动资源管理。
语法与语义

Q4:struct 和 class 的区别是什么?
本质上没区别。struct 默认成员是 public,class 默认是 private。
C++ 中的 struct 可以有函数、继承、多态,和 class 完全一样。
面试官问这个是在考你是不是真的知道默认访问权限,而不是背"结构体是约定俗成"。
Q5:new 和 malloc 的区别?
malloc 只分配原始内存,不调用构造函数。
new 分配内存 + 调用构造函数。
更重要的区别是:new 是运算符,可以被重载;malloc 是函数,不能。
new 失败抛 bad_alloc,malloc 失败返回 NULL。
Q6:标准输入输出函数,C 和 C++ 的区别?
C 用 printf / scanf,编译期不检查格式化字符串和参数类型是否匹配。
C++ 用 std::cout / std::cin,依赖运算符重载,类型安全。
cpp
// C:编译期不报错
printf("%d", 3.14); // UB
// C++:类型自动推断
std::cout << 3.14; // 正确
底层原理

Q7:函数重载在 C++ 里是怎么实现的?
编译器通过名字修饰(Name Mangling)实现。同一个函数名,参数类型不同,编译后的符号名不同:
cpp
void foo(int); // 编译后: _Z3fooi
void foo(double); // 编译后: _Z3food
C 语言不支持函数重载,所以 extern "C" 用来告诉 C++ 编译器不要对这段代码进行名字修饰。
Q8:引用和指针底层是不是一样的?
是的,汇编层完全一样。
但引用在编译期有更强的类型约束:必须初始化、不能重新绑定、不能为空。
面试里说"引用是指针的语法糖衣",比"引用不能为空"更有分量。
Q9:虚函数是怎么实现的?
通过 vtable + vptr。
每个有虚函数的类对象第一个字节是 vptr 指针,指向类级别的 vtable。调用虚函数时通过 vptr 查表找到实际函数地址。
面试里要能说出:vtable 在只读数据段,所有对象共享;构造函数中隐式填充 vptr。
进阶场景
Q10:extern "C" 是干什么的?什么时候需要用?
C++ 编译器会对函数名做 Name Mangling,C 编译器不会。
当 C++ 代码调用 C 库时,需要用 extern "C" 告诉 C++ 编译器"这段代码按 C 方式编译"。
常见场景:调用 Linux 系统调用、调用 C 编译的第三方库。
Q11:C 的结构体能否继承 C++ 的类?
不能直接继承。
C 的 struct 没有虚函数、没有保护级别、没有构造函数。
但可以模拟继承:在子 struct 里嵌套父 struct。或者用 C++ 的 struct(完全等价于 class)来包装 C 结构体。
Q12:什么是 RAII?C 语言能不能做到?
RAII 是 Resource Acquisition Is Initialization,资源获取即初始化。
C++ 通过构造函数获取资源,通过析构函数释放资源,实现自动资源管理。
C 语言可以模拟:用初始化函数 + 清理函数的约定,但没有语法保证。如果程序员忘记调用清理函数,就会泄漏。
cpp
// C++: RAII 保证释放
std::lock_guard<std::mutex> lock(mtx);
// C: 需要手动解锁
pthread_mutex_lock(&mtx);
// ... 如果这里 return 了,锁永远不会被释放
pthread_mutex_unlock(&mtx);
速查清单
| 类别 | C | C++ |
|---|---|---|
| 编程范式 | 过程式 | 面向对象 |
| 函数重载 | 不支持 | 支持(Name Mangling) |
| 内存管理 | malloc / free | new / delete + RAII |
| 函数默认参数 | 不支持 | 支持 |
| 引用 | 不支持 | 支持(指针的语法糖) |
| 模板 / 泛型 | 不支持 | 支持 |
| 异常处理 | 返回码检查 | try / catch / throw |
| 命名空间 | 不支持 | namespace |
面试的本质是:你能不能在被追问时,每一句话都站得住脚。不是背多少答案,是每个答案都能说到底层。
码字不易,欢迎大家点赞,关注,评论,谢谢!