C++ Primer Plus 第八章 函数探幽(二)———函数模板

1.注意函数列表的顺序不同也算重载

2.C++允许向C语言那样的过程编程,面向对象编程,以及泛型编程。函数模板及时一种泛型编程。定义一个模板如下

第一行指出,要建立一个模板,并将类型命名为AnyType,关键字template和typename时必须的,老版本使用class代替typename的,现在也可以用,但是typename更易读。必须使用尖括号。模板并不创建任何函数,而只是告诉编译器如何定义函数。上述函数在声明时应该这样写:

template <typename AnyType>

void Swap(AnyType &a,AnyType &b); 注意上面那一行也要写

注意并非所有的模板函数都必须是模板参数类型,也可以是确定的接班类型

3.函数模板不能缩短可执行程序,最终仍将由若干个独立的函数定义,就像以手工的定义了这些函数一样,最终的代码不包含任何模板,而只包含了为程序生成的实际函数。使用模板的好处是,它使生成多个函数定义更简单,更可靠。

4.函数模板是有局限的,

 对于给定的函数名,可以有非模板函数、模板函数、显示具体化模板函数以及它们的重载版本;显示具体化的声明和定义应该以template<>打头,并通过名称来指出类型;具体化优于常规模板,而非模板函数优于具体化和常规模板。具体代码见287页

5.在代码中包含函数模板本身并不会生成函数定义,它只是一个用于生成函数的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。(这个过程叫做隐士实例化

   现在的编译器还允许显示实例化,声明方法如下: template void Swap<int>(int, int);当编译器看到这条声明后,就使用Swap()模板生成一个使用int类型的实例(函数)。

  显示具体化的声明方法如下:template <>void Swap<int>(int, int);这条声明的意思是不会使用Swap()模板来生成实例,而是说程序员会自己定义一个显示具体化的函数。

 注意,试图在同一个文件中使用同一种类型的显示实例和显示具体化将出错。

6.对于函数重载,函数模板和函数模板重载,c++需要一个定义良好的策略,来决定为函数调用使用哪一个函数定义。策略包括三个步骤。(这个知识点理解的不透彻289页)

   第一步:创建候选函数列表。其中包含与被调用函数的名称相同的函数和模板函数

   第二步:使用候选函数列表创建可行函数列表。这些都是参数数目正确的函数,为此有一个隐士转换序列。例如,使用float参数的函数调用可以将该参数转换为double,从而与double形参匹配,而模板可以为float生成一个实例

  第三步:确定是否有最佳的可行函数,如果有使用它,否则报错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值