函数重载与模板
提到函数重载想必大家都非常清楚,但是大家是否了解所有细节呢,经过这段时间阅读<<C++Primer>>我发现其实我一直以来并未完全理解重载机制,此处做一个小小的总结:
(1)首先函数重载是指对函数名的重载,它只在同一作用域中有效,不同作用域中的名字不可构成重载,除非显示使用using关键字将名字引入该作用域。如例所示:
|
(2)函数重载其实是内部编译器对函数名做了特殊处理,如上例有两个函数名类似:show,show_int;本质上还是根据函数名区分,但是对程序员透明。
(3)参数个数不同可以构成重载。
(4)参数类型(依次比较,第一个与第一个,第二个与第二个......),类型不同有:
1) 基本类型的不同,也即类型名不同;
2) 标量,引用,指针三者不同;
3) const T &与T&;
4) const T*与T*;
5) 值得注意的是标量和引用理论上是不同类型,可以构成重载,但是由于函数对标量和引用的调用方式相同所以会存在 二义性,实际不可行。
如:type a与type &a;const type a与const type& a;type *p与type *const p;const type *p与const type*const p等。
(5)函数是否为const类型。
(6)不以返回值区分,对于标量,const与非const不构成重载。
(7) 参数顺序(假象,其实还是类型判断)也会影响重载,如void show(int,double){};void show(double,int){};构成重载。
基于上述总结我们得知:(1)对一个函数进行重载,它的标量参数版本与引用参数版本二者只能存一,否则调用时会发生二义性;(2)对一个函数进行重载,其引用与常引用版本可以同时存在;(3)<<C++Primer>>中16.2.1中讲到的Const转换其实是这样的const本身并非类型,而是类型的限定符,所以无法将const信息传递给<class T>中的T,因此它只会进行类型转化,而不会由于const存在而产生模板的新的实例。
(1) const与非const标量不构成重载。
|
(2) const和非const引用构成重载。
|
(1) 对与template<class T>无法区分const和非const,只能通过函数参数来区分。
(2) 函数模板在没有实例化前也满足非因const引发的重载机制,以及参数个数等机制,除了类型之外的机制。