内存管理+模板初阶
- 一,内存管理
- 1.1new和delete
- 1.2语法规范
- 补充
- 重点(malloc/free和new/delete的区别和联系)
- 二,模板初阶
- 2.1泛型编程
- 2.2模板函数
- 2.3函数模板格式
- 2.4类模板
一,内存管理
我们在c语言学习了动态开辟内存:mallc;realloc,free这样的函数;而cpp加入了新的操作符,new,delete。
1.1new和delete
我们之前说过,cpp关注的是自定义类型,所以出现这两个操作符的原因就是解决C语言中malloc不方便解决动态申请自定义类型对象初始化的问题。
new的本质就是:开空间+默认构造函数初始化;
delete的本质则是:析构函数+释放空间。
1.2语法规范
//动态申请一个int的空间
int* ptr1 = new int;
//动态申请一个int的空间并初始化为1000
int* ptr2 = new int(1000);
//动态申请十个int类型的空间
int* ptr3 = new int[10] {1,2,3,4,5};
delete ptr1;
delete ptr2;
delete []ptr1;
new和delete的语法规范十分的便于记忆,但是注意符号一定要配对申请的数组释放的时候一定是释放数组的类型,不然编译的时候就会报错。
补充
刚开始我们认识delete的时候可能会有些疑惑析构函数+释放空间感觉好像两个的功能是一样。接下来我们用图来解释。
这里的_a是指针,它本身就有空间,而他又在stack类中,那么我们的delete就先调用析构函数先释放_a的内容,然后释放stack的空间。
重点(malloc/free和new/delete的区别和联系)
二,模板初阶
2.1泛型编程
我们先了解一个概念泛型编程;
泛型编程:编写与类型无关的代码,是代码复用的一种常用手段。模板是泛型编成的基础。这样的概念不是很好理解我们用代码来进一步理解。
//实现交换函数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
一个交换函数,代码里面不一样的只有类型。这样的函数我们一般用参数模板来实现。
2.2模板函数
template<typename T>
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
模板函数:模板函数代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定版本。
2.3函数模板格式
2.4类模板
和函数模板一样,类模板是一个类家族
这里要注意:在写类模板的时候不允许声明和定义分离。