当前课程知识点:基于Linux的C++ > 第十一讲 泛型编程 > 11.7 模板与型式参数化 > LinuxCPP1107
有了异常处理机制
和运行期型式信息的基本概念之后
我们现在讨论这一讲的核心概念
模板与型式参数化
你看我刚才那个动态转型
dynamic_cast〈programmer *〉(e)
把它完成一次动态转型
然后把它初始化给指向 Programmer 的指针 p
这个转型操作就使用到了模板
它使用目标型式作为我们的模板参数
没有这个模板参数
这个转型就会非常的复杂
为啥呢 因为对于编译器来讲
它不知道你要把这个对象 e
它或者是一个对象
或者是一个指向对象的指针
或者是一个对象的引用
当然我们这里它实际上是一个指针
它不知道这个对象
将要转型的目标型式是什么
那么它怎么替你完成这个转型呢
所以模板参数 它的重要性就体现在这里
为什么我们要引入模板
原因就在这里
那么模板到底是怎么工作的呢
C++ 提供了一个新的关键字
叫 template 用它来定义模板
定义的格式是 template〈typename T〉
这就意味着我们定义了一个特定的模板
这样的一个模板可以用来定义函数或者类
你定义函数就叫函数模板
你定义类就叫类模板
这就意味着这样的函数或这样的类
它就有一个型式参数 T
极大地方便了我们编程
template〈typename T〉
就按照这个格式来定义模板
typename 这个关键字
可以使用 class 那个关键字
在这个地方两者的性质是一样的
class 写在这里
就不再指我们面向对象的那个类
所以说这里主要是类
但是它也可以不是类
它只是表示一个特定的型
为了防止混淆
所以我们这里边只使用 typename
我们不使用 class 这是第一步
我们要完成函数模板和类模板的定义
第二步 它要做最重要的体化
体化什么意思
就是使用特定的模板实际参数
来替我们生成真正的函数和类
这样的函数和类
当然就是我们的模板函数和模板类
它构造的就是这样的模板函数
和模板类的特定的实体
它会产生活生生的一个函数和一个类
就这个意思
然后你就可以调用这样的模板函数
就可以使用这样的模板类来定义对象
第三步 它就会编译我们模板函数和模板类
生成最终的程序代码
有一点是需要说明的
就是模板代码一般是放在头文件里
因为编译器需要
在生成我们的代码的时候
要能够看到那个模板的内容
它得替你生成真正的那个函数和类啊
如果看不到那个模板的代码
那么怎么替你生成呢
它生成以后才能编译
所以在这种情况下边
你的模板代码往往是写头文件里的
让别人可见
模板有几个最重要的特点
一是抽象性 模板代码是高度抽象的
它事实上是我们的函数和类的模范
我说“模范” 就是它是“模子”
它是我们的“范本”、“范例”
就这个意思
它是高度抽象的 这是第一点
第二 安全性
模板天然地具有型式检查的功能
所以型式检查能够发现
大多数型式失配问题
使用模板要比含参宏好得多
就是因为它能够做型式检查
这是第二点 安全性
第三点 通用性
函数和类模板
你只需要定义一次就行了
然后它能够根据你的需要
来生成特定的函数和特定的类
第四是易用性 接口是相对直观的
使用模板来定义你的函数和类
对于使用者来讲接口是相对直观的
有一个“〈〉” 看上去稍微有一点点怪
但是本身你一旦熟悉了
会发现还是相对直观的
关键是所有的模板的使用
它是高度一致的 都是“〈〉”
习惯了你就会觉得这个方式
并没有多少特殊的地方
第五个是效率
模板最重要的优势就体现在这里
它能够极大地减少我们的代码编写量
提升我们的编程效率
同时你如果通过编译优化
也可以提升我们程序的运行效率
模板最主要的用途有三个
一个是函数模板 构造一个函数集
因为一个模板定义出来以后
它实际上可以传递不同的型式
同时来构造不同的函数
这些函数就构成一个函数集合
这个就是函数模板
它用于构造一个函数集
实现不依赖于特定数据型的抽象算法
这就是我们的函数模板
第二个用途就是定义类
类模板 它构造的是一个类集合
这样的话
我们就可以实现抽象的数据结构
这个就比我们前面第八讲讲程序抽象
第九讲一直到第十讲
一直讨论的面向对象设计
所提供的代码还要抽象
它就能够提供抽象的
数据结构的实现策略
这是类模板
第三个就是可以做元编程
这是一个非常有趣的功能
它构造在编译期能够运行的运算
有一些东西在编译期就可以算
那么通过模板就可以进行元编程
构造在编译期执行的运算
从而提升我们程序的运行效率
并且可以得到很多有趣的结果
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口