感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步
收入专栏:C++_LaNzikinh篮子的博客-CSDN博客
前言
我们前面讲了C ++中内存的管理,对比了他和C语言动态开辟空间和内存之间的优点与缺点,那为什么C++比C语言要好很多呢?今天我们来学到这个模板概念就一个更深刻的认知了。说到模板就要提到泛型编程
一.泛型编程
泛型编程是一种软件工程方法论,强调使用高度抽象的方式编写算法和数据结构,使得同一套代码可以适用于多种数据类型。这种编程范式在许多现代编程语言中都得到了支持,允许开发者编写更加灵活、可重用的代码,同时保持类型的安全性。
例子:如何实现一个通用的交换函数呢?
C语言中
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;
}
......
如果在C语言中要是一个通用交换函数的话,就非常的冗余,要把每个类型都写下来,非常的麻烦,但是在C++中,可以利用泛型编程的思想,用模板来写,就会轻松很多
template<typename T>
void Swap( T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
几行代码直接搞定
二.模板
模板的意思就是字面的意思,去创造一个模板,然后不管你是什么类型的东西,都可以直接使用
在C++中,模板分为2类,一种是函数模板,一种是类模板
2.2函数模板
在进入函数模板之前,我们先要知道模板的一个关键字template,在写模板前都要写这个关键字,然后就是typename,用来规定类型参数名,也可以使用class
原理:函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。 所以其实模板就是将本来应该我们做的重复的事情交给了编译器
2.3函数模板的实例化
函数模板的实例化分为两种,一种就是隐式实例化一种就是显示实例化,那什么是函数模板的实例化呢?用不同类型的参数使用函数模板时,称为函数模板的实例化
该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int或者double类型而报错。
解决方法一:显示实例化
显式实例化:在函数名后的<>中指定模板参数的实际类型
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
解决方法二:强制类型转换
2.4类模板
如果我要实现一个栈,我要存放很多类型,我总不可能写很多个栈,你要存放哪个类型我就放在哪个栈里面,这样子的话就会非常的麻烦,这个时候呢,类模板就可以派上用场了,我直接写一个栈的模板,不管你是什么类型,全都可以用。
template<typename T>
class Stack
{
public:
Stack(size_t capacity = 4)
{
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
void Push(const T& data);
private:
T* _array;
size_t _capacity;
size_t _size;
};
注意:模版不能声明和定义分离到两个文件.h 和.cpp会出现链接错误。
2.5类模板的实例化
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
Stack<int> st1;
Stack<double> st2;
stack是类名,st1,st2才是类
总结
在C++中模板里面还有很多的性质和知识,在我们学了更多的知识之后再进行补充和讲解。