C语言编译过程
- 预处理:进行#include头文件以及宏定义替换
- 编译:将经过预处理之后的程序转换成汇编代码
- 汇编:将汇编代码转换成机器码,这一步产生二进制目标文件
- 链接:将多个目标文件以及所需的库文件链接成最终的可执行文件
CPP内存管理
- 静态内存区
- 类static数据成员
- 局部static对象
- 定义在所有函数体之外的变量
- 栈内存区:函数体内部非 static 变量。
- 堆内存区:程序员动态分配(new、 delete)的对象。
智能指针
无论函数是否正常结束,智能指针都能确保资源被释放。而使用内置指针管理内存时,若在 new 之后,在 delete 之前发生异常,则内存不会被释放。
shared_ptr
允许多个指针指向同一个对象。
原理:引用计数。每个 shared_ptr 底层都有一个关联的计数器。一旦计数器为0,它会自动销毁所管理的对象,自动释放相关内存。
unique_ptr
独占所指对象
不支持普通的拷贝或赋值。例外:可以拷贝或赋值一个即将销毁的 unique_ptr ,用于从函数中返回。
weak_ptr
指向 shared_ptr 所指对象但不改变其引用计数,不控制所指向对象的生命周期。
vector和list
区别
- list:双向链表
- 链式存储
- 顺序访问
- vector:可变大小数组
- 连续存储
- 随机访问
vector的动态增长:如果连续地址上没有空间容纳新元素,容器重新分配新的内存空间保存已有元素和新元素。将已有元素从旧位置移动到新空间,添加新元素。释放旧存储空间。
- size()和 capacity() :size指已经保存的元素个数;capacity指在不重新分配内存的情况下,最多可以保存的元素个数 。
- 一种分配策略是,每次需要分配新内存空间时将当前容量翻倍。
- 实现目的:确保添加元素更高效。
c++三大特性
继承
- 继承是一种机制,允许一个派生类继承另一个类基类的属性和方法。子类可以继承父类的成员变量和成员函数,并且可以重写父类的方法。继承实现了代码的重用性,子类可以继承父类的功能。
封装
- 封装是将数据和操作数据的方法(函数)捆绑在一起的机制。
- 封装提供了数据隐藏和安全性,防止外部直接访问对象的内部实现细节。
多态
- 定义:多态是指同一个函数可以有不同的实现方式,即同样的方法可以在不同的对象上有不同的行为。
- 作用:多态提供了接口的灵活性和可替代性。它允许基类的指针或引用指向派生类的对象,并且可以在运行时选择调用哪个类的方法,从而实现了动态绑定。
多态实现方法
- 函数重载
- 函数名相同
- 参数列表不同(重载判断依据)(参数类型、参数个数或参数顺序不同)
- 返回类型可以相同也可以不同
- 模版
- 函数模版:sort
- 类模版:vector
- 虚函数:允许基类的指针或引用指向派生类的对象,并且可以在运行时选择调用哪个类的方法,从而实现了动态绑定。
virtual
和Override
new 和 malloc
描述 | new / delete | malloc / free |
---|---|---|
本质属性 | 运算符 | 标准库函数 |
内存分配大小 | 无须指定内存块大小 | 显式指定内存大小 |
类型安全 | 是 | 不是 |
关系 | new 封装了 malloc | |
分配失败时 | 抛出 bac_alloc 异常 | 返回NULL |
其他特点 | 分配释放内存+调用构造函数/析构函数 | 只分配释放内存 |