模板类初学。
所谓函数模板,实际上是建立一个通用函数,它所用到的数据类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定.
而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。
在函数模板中,数据的值(Value)和类型(Type)都被参数化了,发生函数调用时编译器会根据传入的实参
来推演形参的值和类型.
也就是说,函数模板除了支持值的参数化,还支持类型的参数化。
1. 看一个对比案例
- 在未学习模板类之前,我们使用函数重载来实现不同类型的参数
//交换 int 变量的值
void Swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
//交换 float 变量的值
void Swap(float *a, float *b){
float temp = *a;
*a = *b;
*b = temp;
}
//交换 char 变量的值
void Swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
}
//交换 bool 变量的值
void Swap(bool *a, bool *b){
char temp = *a;
*a = *b;
*b = temp;
}
- 在学习模板类之后,我们用模板来定义功能相同、函数体相同、只有数据类型不同的函数
#include <iostream>
using namespace std;
template<typename T> void Swap(T *a, T *b){
T temp = *a;
*a = *b;
*b = temp;
}
int main(){
//交换 int 变量的值
int n1 = 100, n2 = 200;
Swap(&n1, &n2);
cout<<n1<<", "<<n2<<endl;
//交换 float 变量的值
float f1 = 12.5, f2 = 56.93;
Swap(&f1, &f2);
cout<<f1<<", "<<f2<<endl;
//交换 char 变量的值
char c1 = 'A', c2 = 'B';
Swap(&c1, &c2);
cout<<c1<<", "<<c2<<endl;
//交换 bool 变量的值
bool b1 = false, b2 = true;
Swap(&b1, &b2);
cout<<b1<<", "<<b2<<endl;
return 0;
}
2.使用模板的几个关键字
关注定义的函数模板
1.template
是定义函数模板的关键字,它后面紧跟尖括号<>
.
2.尖括号包围的是类型参数(也可以说是虚拟的类型,或者说是类型占位符).
3.typename(class)
是另外一个关键字,用来声明具体的类型参数,这里的类型参数就是T.
4.从整体上看,template<typename T>被称为模板头
.
定义了函数模板后,就可以像调用普通函数一样来调用它们了.
最后,函数模板也可以提前声明,不过声明时需要带上模板头,并且模板头和函数定义(声明)是一个不可分割的整体,它们可以换行,但中间不能有分号。
参考连接: c.biancheng.net/view/2317.html