温馨提示:本篇文章依旧是c++速成系列的文章,但和以往有所不同的是,本篇文章带大家简单了解并能够学会使用模板
泛型编程
概念:编写与类型无关的通用代码,是代码复用的一种手段。
什么是复用?
简单来说就是套用。那么上面的的概念也就可以理解成写一段通用的代码,给其他代码套用
注意:模板是泛型编程的基础。
模板
模板的种类
函数模板、类模板
函数模板
简单解释一下,template:构建模板的一个关键字,typename是定义模板参数关键字,这里的typename也可以是class 注意:千万不能用struct代替class!!!!!
函数模板的实例化
示例
template<typename T>
T Add(T& left, T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
Add(a1,a2);
return 0;
}
这个示例就是模板实例化
当然模板实例化也可以这么玩
template<typename T>
T Add(T& left, T& right)
{
return left + right;
}
int main()
{
int a1 = 10, a2 = 20;
double a3 = 4.0, a4 = 5.0;
Add(a1,a2);
Add(a1, (int)a3);
return 0;
}
之所以使用强转,是因为a1和a3的属性不同,又因为我们在设计模板参数时只设计了一个模板参数,因此要使得两个实参的类型保持一致。
拓展小知识
相信看完上面的解释,已经有小伙伴知道定义的模板参数的个数与实参类型的个数有关。
不错,模板参数的个数与实参的类型个数的确有关,而且还是模板参数类型的个数 == 实参的类型个数
总结:模板参数的个数与实参的类型个数有关 注意:这里的类型个数是指不同类型的个数
除了上面的那种通过强转使得实参的类型保持一致外还有一个方法也可以做到
模板的显式实例化
概念:直接给模板规定好是什么类型,不符合该类型的直接进行强转。
需要注意的是这里并不是所有的类型都可以互相转换的
并且要是出现类似的错误说明我们在写代码的时候一定是哪个模板实例化时的参数写错了才会出现这个bug
类模板
定义格式:
template<typename T>
class 类名
{
public:
成员函数;
private:
成员变量;
};
示例:
template<typename T>
class Stack
{
public:
Stack(size_t capacity = 4)
{
_a = new T[capacity];
_capacity = capacity;
_size = 0;
}
void push(const T& data)
{
_a[_size] = data;
++_size;
}
private:
T* _a;
size_t _capacity;
size_t _size;
};
注意:模板的声明和定义不建议分离到两个文件中!!!!
类模板的实例化
定义格式:类名<int> 对象名;
示例:
Stack<int> st1;
这个就是模板实例化。
本篇文章的内容到这里就结束了,虽然本篇文章的内容没有前面类与对象的内容多,但是建议大家把列出了标题的每个知识点去“消化”一下,比如说概念,如果连模板是个什么东西都不知道,那么又如何继续往下学呢,以及我手敲的代码也自行去敲一下,行今天的内容就到这里,我们下篇文章再见。
都看到这里了,给个三连呗,谢谢啦!!!