当前位置: 首页 > news >正文

C++与C语言的核心区别是啥

博主介绍:程序喵大人

  • 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默认成员是publicclass默认是private
C++ 中的struct可以有函数、继承、多态,和class完全一样。

面试官问这个是在考你是不是真的知道默认访问权限,而不是背“结构体是约定俗成”。

Q5:new 和 malloc 的区别?

malloc只分配原始内存,不调用构造函数。
new分配内存 + 调用构造函数。

更重要的区别是:new是运算符,可以被重载;malloc是函数,不能。
new失败抛bad_allocmalloc失败返回NULL

Q6:标准输入输出函数,C 和 C++ 的区别?

C 用printf/scanf,编译期不检查格式化字符串和参数类型是否匹配。
C++ 用std::cout/std::cin,依赖运算符重载,类型安全。

// C:编译期不报错printf("%d",3.14);// UB// C++:类型自动推断std::cout<<3.14;// 正确

底层原理

Q7:函数重载在 C++ 里是怎么实现的?

编译器通过名字修饰(Name Mangling)实现。同一个函数名,参数类型不同,编译后的符号名不同:

voidfoo(int);// 编译后: _Z3fooivoidfoo(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 语言可以模拟:用初始化函数 + 清理函数的约定,但没有语法保证。如果程序员忘记调用清理函数,就会泄漏。

// C++: RAII 保证释放std::lock_guard<std::mutex>lock(mtx);// C: 需要手动解锁pthread_mutex_lock(&mtx);// ... 如果这里 return 了,锁永远不会被释放pthread_mutex_unlock(&mtx);

速查清单

类别CC++
编程范式过程式面向对象
函数重载不支持支持(Name Mangling)
内存管理malloc / freenew / delete + RAII
函数默认参数不支持支持
引用不支持支持(指针的语法糖)
模板 / 泛型不支持支持
异常处理返回码检查try / catch / throw
命名空间不支持namespace

面试的本质是:你能不能在被追问时,每一句话都站得住脚。不是背多少答案,是每个答案都能说到底层。

码字不易,欢迎大家点赞,关注,评论,谢谢!

http://www.gsyq.cn/news/1461278.html

相关文章:

  • Python与树莓派蓝牙控制机器人:从键盘遥控到GPIO传感器集成
  • 3步快速安装ModTheSpire:杀戮尖塔模组加载器终极使用指南
  • 基于Arduino与3D打印的SMARS机器人制作全攻略:从蓝牙遥控到智能避障
  • GUI是什么?超级详细
  • DeepSeek-V4升级解析:长上下文推理与指令遵循能力跃迁
  • 从希拉穆仁到呼伦贝尔:2026内蒙古草原旅游的甄选逻辑与实践指南 - 深度智识库
  • 【监管合规优先的AI担保方案】:覆盖银保监2024新规的6层可信验证机制详解
  • RC电路阻抗与相位分析:从公式推导到KiCad仿真实践
  • CyberpunkSaveEditor:专业级存档编辑解决方案与安全数据管理指南
  • 别再混淆了!深入对比Linux下SO_REUSEADDR和SO_REUSEPORT的实战区别
  • 【深度解析】Hermes Agent Web UI:自托管长期记忆智能体的架构、场景与 Python 实战
  • RPA自动化进阶:独立开发店群系统实战,我用底层隔离与并发调度砍掉80%人力成本
  • 你的VoLTE电话为什么突然断了?从480、487到504,揭秘那些‘隐藏’的网络切换与超时问题
  • 2026年PDF转JPG详细教程:免费在线、Windows自带、Mac预览、零软件全方案 - 软件小管家
  • 基于Arduino与NRF24L01的无线遥控炮台:从原理到实现的完整指南
  • AI工具与智能抵押整合:92%的金融机构尚未掌握的7个合规性避坑指南(附央行最新监管沙盒白皮书解读)
  • 大模型服务故障的七层架构解析与稳定性应对
  • 面试潜规则⑨:“回去等通知吧”——这句话背后的5种潜台词
  • YoloMouse终极指南:如何免费自定义游戏光标提升操作精度
  • EduCoder实训攻略:从‘刷答案’到‘真学习’,我的高效通关与知识管理实践
  • 基于树莓派Zero W与PIR传感器的户外智能监控系统DIY指南
  • 2026青岛海鲜加工实测:这几家本地人常去,味道鲜价格实
  • MATLAB版人工蜂群算法AGV路径优化工具包,含多测试函数与批量实验支持
  • DIY噪声合成器:用模拟电路实现蝉鸣音效的完整指南
  • 2026 抖音代运营服务商怎么选?TOP5推荐排行及深度解析
  • 全面解读2026年CRM行业:9家主流厂商优缺点详解,附选型技巧 - Joyky
  • Axure RP中文汉化终极指南:3分钟告别英文界面烦恼
  • AI工具狂飙时代:三款实用AI产品深度横向测评
  • 如何高效管理网易云插件:智能工具的完整使用秘籍
  • SAP S4 HANA资产会计上线,别再只设接管日期了!FAA_CMP_LDT里的传输日期和结算年度新玩法