C++
面向过程和面向对象
面向过程编程更关注流程,把问题拆成一连串步骤,函数之间传递数据,按顺序把事情做完。
面向对象编程更关注对象。现实中的事物被抽象成类和对象,数据和方法放在一起,通过对象之间的交互完成业务。
面向对象常说的三大特性是:
- 封装:把数据和操作收进对象内部,对外只暴露必要接口。
- 继承:复用已有类的能力,再做扩展。
- 多态:同一接口在不同对象上表现出不同结果。
简单说,面向过程适合'按步骤做事',面向对象适合'按职责组织代码'。两者不是谁替代谁,更多时候是看场景。
C 语言和 C++ 的区别
- 头文件风格不同:C 常用
.h,C++ 也沿用了这套习惯,只是标准库头文件写法更偏向#include <...>。 - 布尔类型:C99 之前没有单独的
bool,常用0和非0表示真假;C99 引入了_Bool,并在stdbool.h中提供bool、true、false。 - 语言定位不同:C++ 不是'更好的 C',它是在 C 的基础上扩展出来的另一门语言。
- 面向对象能力:C++ 支持类、继承、多态等特性,C 主要还是面向过程。
- 重载:C 不支持函数重载,C++ 支持。同名函数只要参数列表不同就可以共存,编译器会根据参数做区分。
C++ 编译过程
C++ 从源文件到可执行文件,一般经过四步:预处理、编译、汇编、链接。
预处理主要处理 #include、#define、#if、#ifdef 这类指令。头文件会被展开,宏会被替换,注释会被删除,最后生成 .i 文件。这个阶段做的是文本级别的整理,谈不上真正的语义分析。
编译把源代码翻译成汇编代码,生成 .s 文件。
汇编把 .s 文件转成目标文件 .o 或 .obj,这一步已经是二进制形式了。
链接把多个目标文件和库文件拼成最终可执行文件,比如 Windows 下的 .exe、Linux 下的 .out。
链接这一步很关键。单个 .o 文件里可能只知道自己调用了某个函数,但不知道这个函数具体在哪。链接器要把这些引用都找到,补齐符号地址,程序才真正能跑起来。
多态
多态是面向对象的一个核心概念。可以把它理解成'同一个接口,不同对象有不同实现'。
按实现时机来看,多态分两类:
- 静态多态:在编译期就能决定调用关系,比如函数重载、运算符重载、函数模板。
- 动态多态:靠虚函数实现,调用要到运行期才能确定,属于晚绑定。
静态多态更像编译器替你做选择,速度快,但前提是编译期信息足够。动态多态更灵活,代价是运行时要多一次间接查找。
虚函数
在成员函数前加上 virtual,它就成了虚函数。虚函数配合基类指针或引用,可以在运行时决定实际调用哪个版本,这就是动态多态。
底层上,常见实现方式是和。类里有虚函数时,编译器通常会给这个类生成一张表,表里存着虚函数地址。对象创建时,会带上一个指向虚表的指针。通过这个指针,就能在运行期找到真正要调用的函数。


