C++核心编程-01模板
C++核心编程-01模板
1.1 函数模板
1.1.1函数模板的基本语法
(1)语法:
template<typename T>
函数声明或定义
- template — 声明创建模板
- typename — 表面其后面的符号是一种数据类型,可以用class代替(两者效果一样)
- T — 通用的数据类型,名称可以替换,通常为大写字母
(2)使用函数模板的两种方式
- 1)自动类型推导
mySwap(a, b);
- 2)显示指定类型
mySwap<int>(a, b);
1.1.2 函数模板注意事项
- 自动类型推导,必须推导出一致的数据类型T,才可以使用;
- 模板必须要确定出T的数据类型,才可以使用。
1.1.3 普通函数与函数模板的区别
- (1)普通函数可以发生隐式类型转换
- (2)函数模板 用自动类型推导,不可以发生隐式类型转换
- (3)函数模板 用显示指定类型,可以发生隐式类型转换
1.1.4 普通函数和函数模板的调用规则
- (1)如果函数模板和普通函数都可以调用,优先调用普通函数
- (2)可以通过空模板参数列表强制调用函数模板
myPrint<>(a, b);
- (3)函数模板可以发生函数重载
- (4)如果函数模板可以产生更好的匹配,优先调用函数模板
1.1.5 模板的局限性
模板并不是万能的,有些特定的数据类型,需要用具体化方式做特殊实现
//对比两个数据是否相等函数
template<typename T>
bool myCompare(T& a, T& b)
{
if (a==b)
{
return true;
}
else
{
return false;
}
}
//利用具体化Person的版本实现代码,具体化优先调用
//具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型
template<> bool myCompare(Person& a, Person& b)
{
if (a.m_Name==b.m_Name && a.m_Age==b.m_Age)
{
return true;
}
else
{
return false;
}
}
1.2 类模板
1.2.1 类模板的语法
语法:
template<typename T>
类
- template — 声明创建模板
- typename — 表面其后面的符号是一种数据类型,可以用class代替(两者效果一样)
- T — 通用的数据类型,名称可以替换,通常为大写字母
例如:这里创建了一个Person类
//类模板
template<class NameType, class AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
this->mName = name;
this->mAge = age;
}
void showPerson()
{
cout << "name: " << this->mName << " age: " << this->mAge << endl;
}
public:
NameType mName;
AgeType mAge;
};
注意:在使用类模板的时候,要使用”显示指定类型“的方式,指出用的是什么类型
void test01()
{
// 指定NameType 为string类型,AgeType 为 int类型
Person<string, int>P1("孙悟空", 999);
P1.showPerson();
}
1.2.2 类模板和函数模板的区别
- (1)类模板没有自动类型推导的使用方式,必须使用显示指定类型的方式,使用类模板
- (2)类模板在模板参数列表中可以有默认参数