月考之后,再写一篇
模板是C++中十分重要的部分,也是体现C++相较于C语言的优势之处。
由模板延伸出来了一种极其强大的算法——泛型算法(无论类型是什么,程序都可以通过几个类型的共有的,通用的使用方式来执行一些操作),这种强大的算法后面会介绍。
模板的一个例子:
template<typename __Tp> class BIGNUM{ }; template<typename __Tp> void construct(__Tp a,const __Tp b){ };
也就是说,模板可以使用在类和函数上面。
那么,我们为甚么要使用模板呢?
那就讲一个故事吧>_<
从前,有一个十分可怜的使用C语言的程序员怪蜀黍。
他在开发一个A+B的程序。(好简单耶!!!)
他敲出了子函数代码:
int add(int a,int b) { return a+b; }
可是,他还不满足于此。
万一类型是double???
那就再写一个:
double add(double a,double b) { return a+b; }
可是他发现一个问题:两个函数的名字都是add
而C语言并不支持两个同名函数在同一作用域(就是那个重载函数)(C编译器真是无能)
所以这个老大哥转行去C++了(C++编译器支持)(C++会心一笑 ^ \/ ^ )
可是还要实现其他类型的add函数怎么办?
他想到了预处理宏:
#define ADD(type)\ type add(type a,type b)\ {\ return a+b;\ } ADD(int) ADD(char) ADD(double)
可是他还是不满足呀。
因为每一次要使用XX类型的函数,都要重新声明。
于是,他学习了模板。
请出模板大神(大家鼓掌/\ /\ /\)
template<typename __Tp> __Tp add(__Tp a,__Tp b) { return a+b; }
这样,他就把审查变量类型的事情交给了编译器。
编译器会在使用这个函数的地方利用传入参数的类型来推断__Tp代表着什么。
这个故事完。
我们如何调用这个函数?
int main(){ int c,d; //do_sth; add(c,d); }
也可以显明地告诉编译器我们参数的类型,以便执行强制类型转换:
int main() { int c,d; //do_sth add<int>(c,d); }
我们也可以写一个使用模板的类(简称模板类)
template<typename>class ...;
但是,因为我们可爱的编译器不能自主推断加入模板的参数类型,所以需要我们显明地指定类型。