函数模板的基本语法
void mySwap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
void test01() {
int a = 1;
int b = 2;
//自动类型推荐
mySwap(a, b);
//显示指定类型
mySwap<int>(a, b);
}
模板的目的是为了提高复用性,使类型参数化
函数模板与普通函数调用规则
void out(int a, int b) {
cout << "调用的普通函数" << endl;
}
template<typename T>
void out(T a, T b) {
cout << "调用的模板函数" << endl;
}
void test02() {
int a = 3;
int b = 6;
out(a, b);
}
可以看出来优先调用普通函数
可以通过空模板参数列表,强制调用模板函数
void test02() {
int a = 3;
int b = 6;
out(a, b);
//通过空模板参数列表,强制调用模板函数
out<>(a, b);
}
函数模板也可重载
template<typename T>
void out(T a, T b) {
cout << "调用的模板函数" << endl;
}
template<typename T>
void out(T a, T b,T c) {
cout << "调用的重载模板函数" << endl;
}
类模板的定义
#include<iostream>
using namespace std;
//类模板的定义
template <class NameType, class AgeType>
class Person {
public:
Person(NameType name, AgeType age) {
this->name = name;
this->age = age;
}
void showPerson() {
cout << "name" << this->name << "age:" << this->age << endl;
}
private:
NameType name;
AgeType age;
};
void test03() {
Person<string, int> p("tm", 21);
p.showPerson();
}
int main() {
test03();
system("pause");
return 0;
}
类模板和函数模板的区别
- 类模板使用只能用显示指定类型方式
- 类模板中的模板参数列表可以有默认参数
当类模板碰到继承时,需要注意一下几点:
·当子类继承的父类是一个党摸板时,子类在声明的时候,要指定出父类中T的类型·如果不指定,编译器无法给子类分配内存
·如果想灵活指定出父类中T的类型,子类也需变为类模板
构造函数的内外实现
总结:类模板中成员函数类外实现时,需要加上模板参数列表