函数重载与模板

函数重载与模板

          提到函数重载想必大家都非常清楚,但是大家是否了解所有细节呢,经过这段时间阅读<<C++Primer>>我发现其实我一直以来并未完全理解重载机制,此处做一个小小的总结

         (1)首先函数重载是指对函数名的重载,它只在同一作用域中有效,不同作用域中的名字不可构成重载,除非显示使用using关键字将名字引入该作用域。如例所示:


void show()
{
    cout<<"outer"<<endl;
}
namespace in{
using ::show;
void show(int)
{
    cout<<"inner"<<endl;
}
void call()
{
    show();
    show(1);
}

}


        (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标量不构成重载。


template<class T>
void addmy(T a)
{
	a++;
	cout<<"a = "<<a<<endl;
}

template<class T>
void addmy(const T a)
{
	a++;
	cout<<"const a = "<<a<<endl;
}



(2) const和非const引用构成重载。


template<class T>
void addmy(T& a)
{
	a++;
	cout<<"a = "<<a<<endl;
}

template<class T>
void addmy(const T& a)
{
	//a++;
	cout<<"const a = "<<a<<endl;
}

这里有关模板的知识点有两点:

           (1) 对与template<class T>无法区分const和非const,只能通过函数参数来区分。

           (2) 函数模板在没有实例化前也满足非因const引发的重载机制,以及参数个数等机制,除了类型之外的机制。


      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值