C++ 核心概念与内存管理
面向对象和面向过程
面向过程
面向过程编程侧重于步骤和流程,将程序设计成一系列解决问题的步骤。程序被视为由一组函数或过程组成,每个函数完成具体任务,数据在这些函数间传递。
面向对象
面向对象编程关注'对象',将现实事物抽象为程序中的对象。对象包含数据(属性)和操作数据的方法。思想是将数据和操作封装在一起,通过对象交互实现功能。
三大特性
- 封装:数据和操作封装在对象内部,外部通过定义好的接口访问。
- 继承:从已有类派生新类,扩展原有属性和方法。
- 多态:不同对象对同一方法做出不同响应,增强灵活性。
C 语言和 C++ 的区别
- 头文件:C 语言常用
.h,C++ 虽兼容但更推荐使用标准库头文件。 - 布尔类型:C99 之前无布尔类型,用整数 0 表示假,非 0 表示真;C99 新增
_Bool及stdbool.h。C++ 内置bool类型。 - 编译效率:C++ 基于 C 增加了更多功能,编译器处理逻辑更复杂,但在现代优化下性能差异已不明显。
- 语言特性:C++ 不是完全面向对象的语言,它保留了 C 的面向过程特性。C 语言缺乏面向对象带来的易维护、易复用优势。
- 重载:C++ 支持函数重载(同名不同参),C 语言不支持。C++ 编译器通过修饰函数名来区分重载,C 语言则会导致重定义错误。
C++ 编译过程
编译流程分为四个阶段:预处理、编译、汇编、链接。
- 预处理:处理
#开头的指令,如展开宏、插入头文件、删除注释。生成.i文件。 - 编译:将源代码转换为汇编代码,生成
.s文件。 - 汇编:将汇编代码翻译成机器指令的目标文件,如
.o或.obj。 - 链接:将所有目标文件和库文件连接成一个可执行文件(Windows 的
.exe或 Linux 的.out)。
链接解决了跨文件符号引用问题,确保所有调用的函数和变量都能正确找到地址。
多态
是什么?
多态是面向对象的三大特征之一,指不同对象调用同一行为表现出不同形式和结果。本质是一个接口多种实现。
分类
- 静态多态:编译期间确定绑定,如函数重载、运算符重载、函数模板。
- 动态多态:运行期间确定绑定,通过虚函数重写实现,属于晚绑定机制。
虚函数
是什么?
基类函数前加 virtual 关键字声明为虚函数。父类指针指向实际对象时,根据运行时对象类型调用对应虚函数。
底层原理
C++ 通过虚函数表(vtable)和虚函数指针(vptr)实现。含有虚函数的类会有一个虚表,存储该类所有虚函数地址。每个对象包含一个 vptr 指向虚表。子类继承时会继承虚表,重写虚函数会替换表中地址,从而实现运行时多态。
解决的问题
将父类的析构函数设为虚析构,确保删除基类指针时能正确释放子类资源。
构造函数不能设置为虚函数?
创建对象时需先调用构造函数初始化,此时虚函数表指针尚未建立,无法支持虚函数机制。


