函数模板
基本使用
-
思想是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权限了
同时还需要添加:

- 在类前面声明这个函数的实现,并让编译器提前知道这个类和这个模板函数的存在。(写在文件最前面)




















