函数模板和类模板
先讲函数模板:
函数模板,顾名思义,就是一类相似的函数的模板,用这个模板实现的函数就叫做模板函数。
定义形式:
template<模板参数表> /*里面需要有关键字class或者typename两者都可以用*/
<返回值类型> <函数名> (模板参数形参表)
{
//函数模板定义体
}
实例1:基本关键字,语法的规范调用,比较两数的大小
template<typename T>
void display<T a,T b>
{
max=(a>b)?a:b;
cout<<max<<endl;
}
/*调用:*/
display(3);
实例二:带两个参数
template<typename T,class C>
void display<T t,C c>
{
cout<<t<<endl<<c<<endl;
}
实例三:除了传参数,还可以传变量
template<typename T,int size>
void display(T a)
{
for(int i=0;i<size,i++)
{
cout<<a<<endl;
}
}
实际的应用:一个比较不同类型的大小的函数,如果用重载函数的话,需要写很多个重复的,只是类型不同的函数,而使用函数模板实例化出来模板函数,就可以将类型作为参数,那样就可以省掉很多代码量;
如:
template<typename T>
T max(T a,T b)
{
return(a>b)?a:b;
}
/*实际调用*/
int ival=max(100,99);
char cval=max<char>('A','B');
**
- 注意点:1.采用模板参数T的各参数之间必须保持完全一致的类型,模板类型并不具有隐式的类型转换,例如,在int与char之间,在float与int之间,float与double之间等的类型转换
- 模板函数与重载函数,优先调用重载函数,不匹配再调用模板函数,不匹配再强制类型转换,再不匹配则throw出错误;
**
再讲类模板
出现原因:由于某些类中的数据成员或者成员函数的参数因某些需求可能导致类型不同,但是,类中的成员函数的实现方式几乎一样,为了避免代码重用,使用类模板就可以传进去不同的我们需要的参数类型。于是,类模板就从程序员手中蹦出来了。
语法形式:
template<class 类属参数1,typename 类书参数2,...>
class NameofClassTemplate
{
/*这里写类的定义代码;*/
public:
void display(){...}
private:
T *m_pArr;
}
/*类外成员函数定义*/
template<class T> /*每一个成员函数的类外定义都必须写上*/
void MyArray<T>::display()
{
}
注意:模板代码不能分离编译 (不能将声明和定义分开,即分开.h文件和.cpp文件;必须将所有代码都写在.h文件中)
实例:
template<typename T,int kSize,int kVal>
class MyArray
{
public:
MyArray();
~MyArray(){
delete []m_pArr;
m_pArr=NULL;
}
void display();
private:
T *m_pArr;
}
template<typename T,int kSize,int kVal>
MyArray<T,kSize,kVal>::MyArray()
{
m_pArr=new T[kSize];
for(int i=0;i<kSize;i++)
{
m_pArr[i]=kVal;
}
}
template<typename T,int kSize,int kVal> /*每一个类外成员函数的实现都必须写*/
void MyArray<T,kSize,kVal>::display()
{
for(int i=0;i<kSize;i++)
{
cout<<m_pArr[i]<<endl;
}
}
/*实现*/
MyArray<int,5,6> arr;
arr.display();
总结,上面所写的内容即为复习所得,没有涉及到很深的内容,只是包含了简单的定义和使用方法,日后遇到再补充
内容参考:c++语言程序设计教程与实验 清华大学出版社 第三版
慕课网:James大大的c++课程远征之模板篇