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 ;}
这些函数几乎相同,唯一的区别就是形参类型不同
需要事先知道有哪些类型会使用这些函数,对于未知类型这些函数不起作用。
函数模板:是独立于类型的函数,可产生函数的特定版本
类模板:跟类相关的模板,如vector,可产生类对特定类型的版本如vector
函数模板的结构
Template<模板形参表>
<返回值类型>函数名(模板函数形参表)
{
//函数体
}
类模板的结构
Template<模板形参表>
class 类名
{
//类体
};
函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行
在声明了一个函数模板后,当编译系统发现有一个对应的函数调用是,将根据实参中的类型来确定是否匹配函数模板中对应的形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,它称为模板函数。
1.函数模板使用时不提供类型参数,eg:直接调用min(a,9)
2.类模板使用是要求提供类型参数,eg:vector
优点:克服了C++函数重载用相同函数名字重写几个函数的繁琐
缺点:调试比较困难,一般先写一个特殊版本的函数,运行正确后,改成模板函数