当前位置:主页   - 电脑 - 程序设计 - C/C++
轻轻松松从C一路走到C++系列文章之三
来源:网络   作者:佚名   更新时间:2011-09-11
收藏此页】    【字号    】    【打印】    【关闭

  4.函数模数(function template)

   前面讨论的重载机制用来实现求和操作并不受欢迎,这仿佛还不是C++的风格,例如用户需要求两个其它类型(如字符型)对象的和:Add ('a' ‘b’);它必须再为之准备一个版本,尽管其名字和代码还是那副样子:  char Add (char a char b)
{
return a + b;
}

   这样无聊的工作会让灰心的用户开始怀念起古老的“宏”。然而,更先进的东西一一模板,却可以很方便地解决以上问题:  template <class TYPE>
TYPE Add (TYPE a TYPE b)
{
return a + b;
};

   作为模板参数表示了数据类型。在实际的调用中,编译程序根据实际使用的数据类型产生相应的函数。如:  int i=Add(1 2); //int Add(int int)
float f=Add(1.0 2.0); //float Add(float float)

   将得到编译器正确的解释。但以下的使用:  int i=Add('A' 0. 0l);
//error: Could not find a match for 'Add(char double)'

   所当然地会遭到编译器的拒绝。

   以上建立起来的Add)函数模板可以覆盖前面所有的Add()函数,但再来看看以下语句:  struct COMPLEX {float r; float i;};
typedef struct COMPLEX complex;
complex c1 c2;
complex c=Add(cl c2);

   同理,编译器根据Add ()模板定制成:

   c=(c1 +c2 };

   这样的结果是没有定义的,计算机很容易对两个复数的加法不知所措而大发牢骚:

   Error: Illegal structure operation

   既然计算机不喜欢这个作品,没关系,我们为它再做一个函数就是了:  complex Add(complex c1 complex c2)
{
complex c;
c. r=c1. r+c2. r;
c. i=c1. i+ c2. i;
return c;
}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明