模板
模板
函数模板
template <typename T> |
使用模板时,编译器会根据实参的类型来确定模板的实参类型,从而生成对应的函数。
形式
T add(vector<T> a, T b) |
传入引用
template
使用范围仅限紧跟着的第一个函数声明,后续的函数声明不能使用模板。若使用模板但不使用,则需要强制类型转换才能调用这个函数,如:
add<int>(a,b); |
填入的所有元素必须保持一致。
类型转换
类型转换是模板的一大考点:
隐式类型转换:
即类似于char和int的转换char a='a';
void sd(int);
sd(a);
强制类型转换:
即int a=1;
char b='a';
b=(char)a;
强制类型转换,需要强制类型转换符,如:(char)a。
体现在模板上,就是T add(vector<T> a, T b)
{
return b;
}
add<int>(a,b);
重载
可以实现重载
当函数模板和普通函数重名时,编译器会优先选择函数模板,除非使用空模板参数列表。template <typename T>
T add(T a, T b)
{
}
int add(int a, int b)
{
}
int main()
{
add<>(int a=1,int b=0);
}
<>记为空模板参数列表。
特化
template<>add(person a,person b) |
类模板
template <class AH,class sd> |
用于创建类的模板,类模板的类名与模板名相同,类模板的类名后接尖括号,尖括号内为模板形参列表。
类型
类模板不会自动类型推导template <class AH>
void nam(AH a)
{
a.pp();
//模板的函数
}
麻烦的东西,狗都不看
需要的时候直接把模板类的声明填进去就完事了。
继承
模板类的继承template <class AH>
class person
{
public:
AH s;
person(AH s);
}
class son():public person<int>
继承时必须强制类型转换
否则,子类也必须是模板类
如:
```c++
template <class AH>
class son():public person<AH>
现在,用户将类传入模板类person,person带着参数传入模板类son。