一、如何使用函数模板和类模板?
函数模板语法:
template<typename T>
函数声明或定义
解释:
template --- 声明创建模板
typename --- 表面其后面的符号是一种数据类型,可以用class代替
T --- 通用的数据类型,名称可以替换,通常为大写字母
#include<iostream>
using namespace std;
// 函数模板 ,交换两个数
template<typename T> //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
void mySwap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
// 利用函数模板交换
// 两种方式使用函数模板
// 1、自动类型推导
// mySwap(a, b);
// 2、显示指定类型
mySwap<int>(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
输出
20
10
可以通过两种方法进行调用,自动类型推导(不会发生隐式类型转换)和显示指定类型(可以发生隐式类型转换)。
类模板语法:
template<typename T>
函数声明或定义
解释:
template --- 声明创建模板
typename --- 表面其后面的符号是一种数据类型,可以用class代替
T --- 通用的数据类型,名称可以替换,通常为大写字母
#include<iostream>
using namespace std;
#include<string>
// 类模板
template<class NameType, class AgeType> //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
class Person
{
public:
Person(NameType name, AgeType age)
{
this->mName = name;
this->mAge = age;
}
void showPerson()
{
cout << "name: " << this->mName << " age: " << this->mAge;
}
NameType mName;;
AgeType mAge;
};
void test01()
{
// 指定NameType 为 string 类型,AgeType 为 int 类型
Person<string, int>p1 ("孙悟空", 999);
p1.showPerson();
}
int main() {
test01();
return 0;
}
输出
name: 孙悟空 age: 999
类模板和函数模板语法相似,在声明模板 template 后面加类,此类称为类模板,在创建对象时指定具体的模板参数类型。
二、模板的优点是什么?
- 模板复用代码,提高代码的可重用性,把实例化具体类型的工作交给编译器,节省资源,更快的迭代开发。
- 增强了代码的灵活性。
-
函数模板方式克服了C语言解决类似问题时使用大量不同函数名表示相关功能,克服了C++函数重载用相应函数名字重载几个函数的繁琐
-
克服了宏定义不能进行参数类型检查的弊端。