模块
template<class T>
函数声明或定义
//函数模板
//两个整形交换函数
void swapInt(int &a, int &b) {
int temp = a
a = b
b = temp
}
//函数模板
template<typename T> //声明一个模板,告诉编译器后面紧跟着T
void mySwap(T &a, T &b) {
T temp = a
a = b
b = temp
}
int main() {
//利用函数模板交换
//1.自用类型推导
int a = 10
int b = 20
//mySwap(a, b)
//2.显示指定类型
mySwap<int>(a,b)
函数模板的注意事项
自动推导,必须要一致才行
模板必须要明确的数据类型才可以用
函数模板案例
普通函数和函数模板的区别
普通函数与函数调用规则
1.如果普通函数和函数模板都可以调用,优先考虑普通函数
2.可以通过空模板参数列表,强制调用 函数模板
myPrint<>(a,b);//空模板
3.函数模板可以发生函数重载
4.如果函数模板可以产生更好的匹配,优先调用函数模板
函数模板的局限性
template<class T>
void f(T a, T b){
a = b;
}
学习模板并不是为了写模板,而是在STL中能够运用系统提供的模板
类模板
建立一个通用类,类中的成员 数据类型可以不具体,用一个虚拟的类型来代表
template<class NameType, class AgeType>
class Person{
};
template<class NameType, class AgeType>
class Person {
public:
Person(NameType name, AgeType age) {
this->m_Name = name;
this->m_Age = age;
}
NameType m_Name;
AgeType m_Age;
};
void test03() {
Person<string, int> p1("孙悟空", 9999);
}
类模板和函数模板的区别
类模板对象做函数参数
1.指定传入的类型
2.参数模块坏
3.整个类模块化
类模板与继承
当子类继承的父类
template<class T>
class Base{
T m;
};
class Son:public Base<int>,必须要知道父类中的T类型,才能继承子类
};