模板
一、函数模板
一、函数模板的定义
函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。
模板就是一种对类型进行参数化的工具。
二、函数模板的作用
函数模板是用于生成函数,增加了程序的可重用性,不需要建立多个重载函数(即不用因为要作用于不同数据类型建立多个函数)。
三、函数模板的使用
可以使用typename,也可以使用class
#include<iostream>
using namespace std;
template <typename T>//T(也可以用其他名称,如C,d等)表示的是数据类型的模板等,在执行时会按照传递的实际参数来决定其具体类型
void function(T a,T b){//建立的一个函数模板,T代表的数据类型取决于传递的实际参数
cout<<a<<" "<<b<<endl;
}
int main(){
int a=10,b=10;
function(a,b);//调用模板函数,因为传递的是int类型,所以此时T会变成int类型
return 0;
}
其他情况
1)不需要将模板函数的形参都用T来表示,也可以用其他类型
template <typename T>
void function(T a,int b){//这样写表明只有a的类型取决于传递参数
cout<<a<<" "<<b<<endl;
}
2)同一个函数的T不能同时表示两种数据类型
#include<iostream>
using namespace std;
template <typename T>
void function(T a,T b){
cout<<a<<" "<<b<<endl;
}
int main(){
int a=10;
double b=10;
function(a,b);//此时a传递的是int型,b传递的是double型,T无法同时表示两种类型,这样会出错
return 0;
}
3)不允许使用多个模板参数列表
#include<iostream>
using namespace std;
template <typename C>
template <typename T>//错误,只能声明一个函数模板
void function(C a, C b) {
cout << a << " " << b;
}
int main() {
int a = 10;
int b = 20;
function(a, b);
}
二、类模板
类模板是用来生成类的。声明与模板函数类似。
但类模板调用时必须指定输入了什么数据,也就是尖括号不能省略,这点与函数模板不一样。
声明:
template<class T1,class T2,class T3,……>//声明类模板里的数据类型
class 类名{//可以用T1,T2,T3来作为数据类型来表示数据
……
}
int main()
{
类名<class T1,class T2,class T3,……> 对象(……)//调用时必须指定输入了什么数据,也就是尖括号不能省略,这点与函数模板不一样
}
例子:
#include<iostream>
#include<string>
using namespace std;
template <class T1,class T2,class T3>//类模板里成员变量的数据类型的声明
class person {//建立类模板
public:
person(T1 _name, T2 _sex, T3 _age) {//建立构造函数
name = _name;
sex = _sex;
age = _age;
}
void print() {
cout << "姓名:" << name << "\n性别:" << sex << "\n年龄:" << age << endl;
}
private:
T1 name;
T2 sex;
T3 age;
};
int main() {
person<string, string, int>s("宇哥", "男", 23);//通过传递参数将string赋予T1和T2,将int赋予T3
s.print();
return 0;
}