函数模板
基本使用
-
思想是Java里的泛型(不确定用什么类型的数据)
-
这里template这一句,意思是声明T是泛型,后面写用到泛型T的函数。
-
建议都用
template<class T>
应用场景:不同数据类型的交换函数
两种使用方法:
模板注意事项
普通函数和函数模板的区别
- 普通函数:
- 自动类型推导,不会隐式转换
- 声明T的类型,就没问题,可以隐式转换。(尽量声明T)
调用规则
- 空模板参数列表,强制调用函数模板:
- 其实就是用模板参数列表:
<>
声明一下,我想优先用模板,但是参数列表是空的。
- 模板也可以重载
- 一般写了函数模板,就别写普通函数了
模板中是特殊泛型
有以下问题:
为了处理某些特殊数据类型,可以提供这种类型专用的模板:
- 原代码:
- 通过给函数重载前添加
template<>
来定义,这样就不会调用普通的函数模板
类模板
基本语法
- 类模板声明:关键是修改模板参数列表
- 类模板的使用
类模板和函数模板的区别
- 类模板没有自动类型推导
- 类模板可以用默认参数列表
成员函数创建时机
- 直到调用这个类模板,才会创建下面函数,否则不报错。
- 上面这个类模板,只能调用Person1类的show函数,Person2类会在 运行时 报错。
类模板对象做参数
- 先写个类模板:
- 形参指定类型:带上<>内容
- 这是最常用的方法
- 参数也变成模板:参数用模板并声明
typeid(类型).name()
可以输出是什么类型
- 一整个类变成T
类模板与继承
- 子类继承的时候声明:
- 创建子类对象时候,声明了 T1 和 T2 的类型,其中,T2又声明了继承Base的类型。
类模板中成员函数的类外实现
- 写作用域
- 写模板参数列表 <>
- 类外实现:
- 成员函数:
类模板分文件编写
-
.h文件一般写类声明
-
.cpp文件一般写函数内部逻辑
解决方法1:引入.cpp
解决方法2:将.h和.cpp的内容写到一起,后缀名为.hpp
类模板与友元
类外实现很麻烦:
- 在类内声明这个函数,m_Name 和 m_Age 已经是private权限了
同时还需要添加:
- 在类前面声明这个函数的实现,并让编译器提前知道这个类和这个模板函数的存在。(写在文件最前面)