按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
过来。有了C++,你甚至可以使用多载(overloaded )函数,那么你就可以仍旧使用相
同的函数名称。函数的多载的确使我们有比较清爽的程序代码,但它们意味着你还是必须
在你的程序的许多地方维护完全相同的算法。
C 语言对此问题的解答是:使用宏。虽然你因此对于相同的算法只需写一次程序代码,
但宏有它自己的缺点。第一,它只适用于简单的功能。第二个缺点比较严重:宏不
提供资料型别检验,因此牺牲了C++ 的一个主要效益。第三个缺点是:宏并非函数,
程序中任何调用宏的地方都会被编译器前置处理器原原本本地插入宏所定义的那一
段码,而非只是一个函数调用,因此你每使用一次宏,你的执行文件就会膨胀一点。
Templates 提供比较好的解决方案,它把「一般性的算法」和其「对资料型别的实作
部份」区分开来。你可以先写算法的程序代码,稍后在使用时再填入实际资料型别。新
的C++ 语法使「资料型别」也以参数的姿态出现。有了template ,你可以拥有宏「只
写一次」的优点,以及多载函数「类型检验」的优点。
C++ 的template 有两种,一种针对function,另一种针对class 。
Template Functions
假设我们需要一个计算数值幂次方的函数,名曰power 。我们只接受正幂次方数,如果
是负幂次方,就让结果为0 。
对于整数,我们的函数应该是这样:
#0001 int power(int base; int exponent)
#0002 {
#0003 int result = base;
#0004 if (exponent == 0) return (int)1;
#0005 if (exponent 《 0) return (int)0;
#0006 while (……exponent) result *= base;
#0007 return result;
#0008 }
101
…………………………………………………………Page 164……………………………………………………………
第篇 勿在浮砂築高台
对于长整数,函数应该是这样:
#0001 long power(long base; int exponent)
#0002 {
#0003 long result = base;
#0004 if (exponent == 0) return (long)1;
#0005 if (exponent 《 0) return (long)0;
#0006 while (……exponent) result *= base;
#0007 return result;
#0008 }
对于浮点数,我们应该。。。,对于复数,我们应该。。。。喔喔,为什么不能够把资料型别也变
成参数之一,在使用时指定呢?是的,这就是template 的妙用:
template T power(T base; int exponent);
写成两行或许比较清楚:
template
T power(T base; int exponent);
这样的函数声明是以一个特殊的template 前缀开始,后面紧跟着一个参数列(本例只一
个参数)。容易让人迷惑的是其中的〃class〃 字眼,它其实并不一定表示C++ 的class,
它也可以是一个普通的数据类型。 只不过是表示:T 是一种类型,而此一类型
将在调用此函数时才给予。
下面就是power 函数的template 版本:
#0001 template
#0002 T power(T base; int exponent)
#0003 {
#0004 T result = base;
#0005 if (exponent == 0) return (T)1;
#0006 if (exponent 《 0) return (T)0;
#0007 while (……exponent) result *= base;
#0008 return result;
#0009 }
传回值必须确保为类型T ,以吻合template 函数的声明。
下面是template 函数的调用方法:
102
…………………………………………………………Page 165……………………………………………………………
第2章 C++ 的重要性伲�
#0001 #include
#0002 void main()
#0003 {
#0004 int i = power(5; 4);
#0005 long l = power(1000L; 3);
#0006 long double d = power((long double)1e5; 2);
#0007
#0008 cout