“模板”学习笔记(1)-----引出模板
====================C++中引出模板的原因====================
我们大家都知道,C++给我们提供了众多的数据类型,比如说整型、浮点型、双精度型、布尔型等等。而且C++还为我们提供了一种函数重载的方式,即函数名相同,但是类型不同,那么也可以被C++编译器所认识到,进而可以输出不同的结果。下面,我们以一个程序为例来说明:
#include <iostream> using namespace std; int sum(int a,int b);//两个整型变量相加 double sum(double a,double b);//两个双精度型变量相加 float sum(float a,float b);///两个浮点型型变量相加 int sum(int a,int b) { return a+b; } double sum(double a,double b) { return a+b; } float sum(float a,float b) { return a+b; } int main() { int x=1,y=2; cout<<"整型变量的值为:"<<x<<" "<<y<<endl; cout<<"相加的结果为:"<<sum(x,y)<<endl; double l=1.11111f,m=2.22222f; cout<<"双精度型变量的值为:"<<l<<" "<<m<<endl; cout<<"相加的结果为:"<<sum(l,m)<<endl; float p=1.2,q=2.3; cout<<"浮点型变量的值为:"<<p<<" "<<q<<endl; cout<<"相加的结果为:"<<sum(p,q)<<endl; return 0; }
在上面这个程序的第4、5和6行,我们分别重载了sum()函数,这三个sum()函数的功能是完全一样的,都是返回一个两数之和。但是我们注意到,每个sum()函数的类型不一样,这样,在主程序中输入不同的参数时,编译器会自动调用与之类型匹配的sum()函数输出结果。程序运行的结果如下:
上面这个程序虽然实现重载sum()函数达到对每种不同类型的参数的响应,但是,程序十分臃肿,一个小小的相加程序居然用了35行!这是不被接受的。那么我们不禁要想一想了,有没有什么办法能够替代这种冗长的程序呢?
答案其实就是运用模板!有了模板,我们就不需要重载了,接下来我们同样以这个相加的程序来作为例子说明下:
#include <iostream> using namespace std; template<class ElementType>//声明模板类型 ElementType sum(ElementType a,ElementType b) { return a+b; } int main() { int x=1,y=2; cout<<"整型变量的值为:"<<x<<" "<<y<<endl; cout<<"相加的结果为:"<<sum(x,y)<<endl; double l=1.11111f,m=2.22222f; cout<<"双精度型变量的值为:"<<l<<" "<<m<<endl; cout<<"相加的结果为:"<<sum(l,m)<<endl; float p=1.2,q=2.3; cout<<"浮点型变量的值为:"<<p<<" "<<q<<endl; cout<<"相加的结果为:"<<sum(p,q)<<endl; return 0; }
呵呵,直观上这个程序就比刚刚那个简洁,只有22行。下面我们来认真分析一下这个程序到底说了什么。首先我们可以看到,在程序的第3行,我们就声明了一个模板类型ElementType。这就是模板的声明格式,如下:
template<class Type1,class Type2>
template是声明模板的关键字,尖括号中的class表示后面跟着的参数为自定义的模板类型,上面我们定义的类型为Type1和Type2。应该特别注意的是,模板声明之后不加;号!!!
之后在程序的5到8行我们用自定义的类型ElementType创建了一个模板函数。函数模板说白了就是一个模子,用这个模子我们就可以创建出许多功能相同、参数类型和返回值不同的函数,从而这样就实现了代码的重用~~~在这个函数中,我们并没有为sum()函数提供具体的参数类型,只用ElementType来代替。这样编译器就会根据实际传递进来的类型和我们自定义的函数模板来创建sum()函数。由于这种工作分别在程序的第14行、17行和20行被执行了3次,所以说sum()函数被重载了3次,以适应不同的类型的数据。