泛型编程——模板机制

C++软件重用的体现

1.面向对象的思想:继承和多态,标准类库

2.泛型程序设计的思想:模板机制,标准模板库STL

泛型程序设计

泛型程序设计,简单地说就是使用模板的程序设计法。将一些常用的数据结构(eg:链表,数组,二叉树)和算法(eg:排序,查找)写成模板,以后则不论数据结构里面放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。

标准模板库就是一些常见数据结构和算法的模板的集合。有了STL,不必再从头开始编写繁多的标准数据结构和算法,并且一样可获得非常高的性能。

模板引子

假如设计一个求两参数最大值的函数,在实践中我们可能需要定义四个函数:

int max ( int a , int b ) { return ( a > b ) ? a , b ; }
long max ( long a , long b ) { return ( a > b ) ? a , b ;}
double max ( double a , double  b ) { return ( a >b)? a , b ; }
char max ( char a , char b ) { return ( a > b ) ? a , b ;}

这些函数几乎相同,唯一的区别就是形参类型不同

需要事先知道有哪些类型会使用这些函数,对于未知类型这些函数不起作用。

模板的概念

  1. 所谓模板是一种使用无类型参数来产生一系列函数或类的机制
  2. 若一个程序的功能是对某种特定的类型数据进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用,这就是模板的由来
  3. 模板是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型
  4. 通过模板可以产生类或函数的集合,使用它们操作不同的数据类型,从而避免需要为每一种数据类型产生一个独立的类或函数。

模板分类

函数模板:是独立于类型的函数,可产生函数的特定版本

类模板:跟类相关的模板,如vector,可产生类对特定类型的版本如vector

函数模板的结构

Template<模板形参表>
<返回值类型>函数名(模板函数形参表)
{
   //函数体
}

类模板的结构

Template<模板形参表>
class 类名
{
   //类体
};

模板工作方式

函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行

在声明了一个函数模板后,当编译系统发现有一个对应的函数调用是,将根据实参中的类型来确定是否匹配函数模板中对应的形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,它称为模板函数。

函数模板与类模板使用时有何不同

1.函数模板使用时不提供类型参数,eg:直接调用min(a,9)

2.类模板使用是要求提供类型参数,eg:vectorv;其中int就是类型参数

模板优缺点

优点:克服了C++函数重载用相同函数名字重写几个函数的繁琐

缺点:调试比较困难,一般先写一个特殊版本的函数,运行正确后,改成模板函数

你可能感兴趣的:(STL-编程)