



1.内存管理
1.1. 入手题目

1.1.1 图像理解

1.1.2 C++内存管理
- C++内存管理方式:通过new和delete操作符进行动态内存管理
cpp
int main() {
int* p1 = new int;//动态申请一个int类型空间(会调用构造函数)
int* p2 = new int(10);//动态申请一个int类型空间+初始化10
int* p3 = new int[10];//动态申请十个int类型空间
int* p4 = new int[10] {1,2,3};//动态申请十个int类型空间+花括号初始化(没有值的为0)
delete p1;//析构+释放动态空间
delete p2;
delete[] p3;
delete[] p4;
}

- new/delete 和 malloc/free最大区别是 new/delete对于++【自定义类型 】++ 开空间 + 调用构造函数 / 析构函数
- 单个,用new和delete操作符;连续,用new\[\]和delete\[\]
- new和delete是用户进行动态内存申请和释放的操作符,
operator new 和operator delete是系统提供的全局函数,- new在底层调用operator new全局函数来申请空间(失败会抛异常),
- delete则是operator delete全局函数来释放空间
1.2 malloc/free和new/delete
- 不同点

- 共同点:从堆上申请空间,需要用户手动释放
1.3 new和delete的实现原理
1.3.1 内置类型(基本相似)
- new/delete申请和释放的是单个元素的空间,new\[\]和delete\[\]申请的是连续空间
- new在申请空间失败时会抛异常 ,malloc会返回NULL。
1.3.2 自定义类型
- new的原理
-
- 调用++operator new++函数申请空间
-
- 在申请的空间上执行构造函数,完成对象的构造
-
- delete的原理
-
- 在空间上执行析构函数,完成对象中资源的清理工作
-
- 调用operator delete函数释放对象的空间
-
- **new TN**的原理
-
- 在operator new\[\]中实际调用operator new函数完成N个对象空间的申请
-
- 在申请的空间上执行N次构造函数
-
- delete\[\]的原理
-
- 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
-
- 在operator delete\[\]中调用operator delete来释放空间
-
2. 模板初阶
2.1 泛型编程
编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
2.1.1 函数模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
- template<typename T1, typename T2,......,typename Tn>
++返回值类型 函数名(参数列表){}++
(typename是用来定义模板参数关键字,也可以使用class) - 编译器编译阶段,模板函数调用,编译器根据传入的实参类型推出对应类型的函数以供调用
- 函数模板的实例化,不同类型的参数使用函数模板
- 隐式实例化 :让编译器根据实参推演模板参数的实际类型
(在模板中,编译器一般不会进行类型转换操作)
- 显式实例化 :在++函数名后的<>++ 中指定模板参数的实际类型(Add<int>(a, b);)
- 隐式实例化 :让编译器根据实参推演模板参数的实际类型
- 一个非模板函数(成品)可以和一个同名的函数模板(半成品)同时存在,该函数模板还可被实例化为这个非模板函数
- 确定是成品情况,直接调用成品;不是或生成更好匹配的则调用半成品
- 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
2.1.2 类模板

- 模板不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误
- 类模板的实例化
- 类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中
- 类模板名字不是真正的类 ,而实例化的结果才是真正的类

- 类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中
3. STL简介
-
STL(standard template libaray-标准模板库): C++标准库的重要组成部分
-

-
能用,明理,能扩展
完~走过路过不要错过,有错请指出谢谢