函数模板和类模板
c++提供了函数模板。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就叫做函数模板。
类模板与函数模板的定义和使用类似,使用前景,有时候有两个或多个类,其功能是相似的,仅仅是数据不同,则用到类模板
文章目录
前言
一、函数模板定义语法
1.函数模板定义形式
template <类型形式参数表>
类型形式参数的形式为
typename T1,typename T2,typename T3.........typename Tn
class T1,class T2,class T3.......class Tn
//函数模板声明
template <类型形式参数表>
类型 函数名 (形式参数表)
{
语句序列
}
2.函数模板实例—做函数参数
#include<iostream>
using namespace std;
template<typename T,typename T2>
void sortArray(T *a,T2 num)
{
T tmp;
int i,j;
for(i =0;i<num;i++)
for (j=i+1;j<num;j++)
{
if(a[i]<a[j])
{
tmp=a[i];
a[i]=a[j];
a[j]=a[i];
}
}
}
template <class T>
void printT(T *a,int num)
{
for(int i=0;i<num;i++)
{
cout<<a[i]<<" ";
}
}
void main()
{
char a[]="adbcf";
int num=strlen(a);
//输出排序之前的字符串
printT<char>(a,num);
//输出排序之后的字符串
sortArray<char,int> (a,num);
printT<char>(a,num);
return ;}
3.普通函数和模板函数的区别
- 普通函数的调用:可以进行隐式的类型转换
- 函数模板函数的调用(本质:类型参数化)
将严格的按照类型进行匹配,不会进行自动类型转换
4.函数模板机制结论
1.编译器从函数模板通过具体类型产生不同的函数
2.编译器会对函数模板进行两次编译
两次编译地方
1、在声明的地方对模板代码本身进行编译
2、在调用的地方对参数替换后的代码进行编译
二、类模板
1.类模板定义
类模板由模板声明和类说明构成
template <类型形式参数表>
类声明
(1)案例演示
template<typename T>
class A
{
public:
A(T t)
{
this->t=t;
}
public:
T t;
}
void main()
{
A<int> a(100);
A<char> b('z');
return ;
}
(2)结论
1、类模板用于实现类所需数据的类型参数化
2、类模板在表示如数组、表、图等数据结构显得特别重要
通过类模板可以让数据类型和算法进行有效分离
2.从模板类派生普通类
template <typename T>
class A{
public:
A(T a)
{
this->a =a;
}
public:
void printA()
{
cout<<"a="<<a<<endl;
}
public:
T a;
}
class B::public A<int>
{
public:
B(int a,int b)::A<int>(a)
{
this->b =b;
}
void printB()
{
cout<<"a="<<a<<"b="<<b<<endl;
}
private:
int b;
}
void main()
{
B b1(1,2);
return ;
}
1、子模板类派生时,需要具体化模板类,c++编译器需要知道
2、父类的数据类型具体是什么样子的,要知道,父类说咱的内存大小是多少,只有数据类型固定下来,才知道如何分配内存
3、从模板类派生模板类
template <typename T>
class A{
public:
A(T a)
{
this->a =a;
}
public:
void printA()
{
cout<<"a="<<a<<endl;
}
public:
T a;
}
template<typename T>
class c:public A<T>
{
public:
c(T c, T a):A<T>(a)
{
this->c=c;
}
void printC()
{
cout<<"c:"<<c<<endl;
}
protected:
T c;
}
void main()
{
c<int> c1(1,2);
printC();
return;
}
总结
1、模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属
2、模板用于逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为