系列文章目录
【C++】| 01——泛型编程 | 模板
文章目录
- 1. 认识泛型编程
- 2. 函数模板
- 1.1 函数模板的语法
- 1.1.1 定义模板
- 1.1.2 应用模板实现函数
- 1.1.3 使用模板函数(实例化)
- 1.1.3.1 隐式使用(实例化)
- 1.1.3.2 显式使用(实例化)
- 1.1.3.3 使用函数模板的注意事项(实例化)
- 2. 类模板
- 2.1 定义类模板
- 2.2 使用类模板
- 2.3 类模板实例化对象 做函数入参
- 2.4 类模板继承
- 2.7 类模板友元
- 2.6 类模板声明和定义分文件编写
- 3. 总结
1. 认识泛型编程
我们在学习编程的过程中 常会听到 面向过程、面向对象、抽象等概念,那什么是泛型呢?它有什么用呢?
什么是泛型编程?
泛型是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。
——来自维基百科
通俗点就是 实现不关心参数(数据类型) 功能代码的一种方式
泛型编程有什么用呢?
比如一个函数不关心 传入的参数类型 那么这个函数是不是具有了通用性
作用:让程序复用 具有通用性
泛型编程可以应用到哪里
它可以应用到函数、类等其他很多里面
2. 函数模板
函数模板就是应用泛型编程的函数。模板顾名思义。也就是套壳子 别人写好的作业改名字 不关心内容 里面 写上我的名字就是我的作业。
作用:实现一个通用函数(函数返回值/入参类型 用替代类型表示 后期在使用时 自定义类型 使用即可)
注: 模板的通用性是有局限的
下面通过举例 来了解函数模板的作用
1、在C/C++中我要实现一个 计算两个整数和 及两个小数和
我们可以看到我们用函数模板后 只需要给一个函数传入不同参数即可实现 不同需求
后面会详细的介绍模板的定义和应用
1.1 函数模板的语法
1.1.1 定义模板
1.1.2 应用模板实现函数
eg : 使用函数模板实现 一个两数交换的函数
1.1.3 使用模板函数(实例化)
使用函数模板也就是 函数模板实例化
实例化就是 填入参数使用函数
有两种使用方式(实例化)
1、隐式实例化(不指定类型 编译器自动检测)
2、显式实例化(指定类型)
下面通过例子说明
1、交换2个整数
2、交换2个单精数
3、交换2个字符型
1.1.3.1 隐式使用(实例化)
编译器通过我们填入的实参 自动推导出该函数入参的实际类型
函数模板调用过程
1.1.3.2 显式使用(实例化)
编译器通过我们指定的参数类型 使用函数
显式: 函数名 + <指定的参数类型>
eg: func < int >(a,b);
注意:显示使用(实例化) 我们指定了参数类型 所以只能传入 对应类型
1.1.3.3 使用函数模板的注意事项(实例化)
- 隐式使用(实例化)时
当我们函数使用1个通用类型时 比如 T 我们填入的参数类型必须一致
即参数类型不会隐式转换(普通函数会)
看图理解
2、普通函数和函数模板 可以发生重载
3、函数模板也可以重载
2. 类模板
类模板 就是将模板应用到了类里。它和函数模板有以下区别
1、函数模板可以隐式实例化(自动识别leim类型) 类模板不行
2、函数模板不可以默认参数 (C++11之后可以)
2.1 定义类模板
template + <class/template 类模板名> // 类模板定义和函数模板定义相似
定义有默认参数的类模板
2.2 使用类模板
eg: 定义一个狗类 并实例化类模板 对象
eg: 类模板成员函数 在类外实现
2.3 类模板实例化对象 做函数入参
2.4 类模板继承
2.7 类模板友元
1、类内实现友元
2、类外实现友元
类外实现需要先声明类模板及函数 让编译器可以识别到
2.6 类模板声明和定义分文件编写
在存在很多类的时候 我们就需要分文件编写 来管理代码。在C语言中 一般结构体/函数等声明在 头文件(.h)里 ,源文件(.c) 引入(#include 头文件)即可。但在C++中 当我们类模板声明和定义分文件后 源文件引入的话会存在问题。
这种情况下 会报错 无法链接 编译器在定义源文件里找不到 类模板的实例化
解决方法:将类模板的声明和定义放到一个文件 “xxxx.hpp” 或者 xxxx.h 里
3. 总结
面向对象 泛型编程 等编程思想 都是为了让程序更具有通用性 。当然 官方也为我们提供了标准的模板库 即STL 标准模板库。