招聘网站上写着「熟悉C/C++」,很多人以为这是一门语言。真到写代码才发现,C 里没有 class,C++ 里 struct 却能带成员函数,两个东西差得比想象中多。

一个面向过程,一个支持面向对象

C 语言的基本单位是函数,数据用 struct 打包,操作数据的逻辑另外写。C++ 在 C 的基础上加了类、继承、虚函数和多态,能把数据和操作绑在一起。不过 C++ 不是纯面向对象,照样能写面向过程的代码。

所以「C++就是带类的C」这句话只对了一半。类只是入口,后面的模板、STL、异常、命名空间,才是日常写 C++ 绕不开的东西。

语法上的几个硬差别

  • 引用:C++ 有引用,函数传参可以直接改实参;C 只能传指针,调用处要取地址。
  • 重载:C++ 允许同名函数靠参数列表区分,C 里同名就是重复定义,编译直接报错。
  • 内存:C++ 用 new 和 delete,会调用构造和析构;C 用 malloc 和 free,只负责分配和释放一块内存。
  • 命名空间:C++ 有 namespace,C 靠函数加前缀避免重名,比如 pthread_、mysql_ 这种写法。
  • 模板和 STL:C++ 能直接用 vector、map;C 要自己写链表,或者找第三方库。

编译和链接也不一样

C 代码基本能直接丢进 C++ 编译器里编,反过来不行,C 编译器不认 class 和模板。C++ 编译时会对函数名做修饰,调用 C 写的库需要额外的链接声明,否则容易报 undefined reference。

编译速度上,C++ 模板一多,小项目编几分钟也不奇怪;C 通常快不少,这也是嵌入式项目偏爱 C 的原因之一。

用途上各有各的地盘

C 更多出现在内核、驱动、单片机、RTOS 这些地方,资源紧、行为要可预测。C++ 常见于游戏引擎、桌面软件、浏览器、高频交易,需要抽象又不想丢性能。两者不是替代关系,很多项目是 C 写底层、C++ 写上层。

学哪个?想打基础先学 C,指针、内存、编译链接这些概念绕不过去;想尽快做带界面的东西,可以直接上 C++,但别跳过指针那一章。C++和C语言的区别,说到底不是谁高级,而是各自解决的问题不同,先想清楚自己要做什么。