读过C++ primer后,笔记:
重载函数的解析过程:
1)创建候选函数列表。其中包含与被调用的名称相同的函数和模板函数。
2)使用候选函数列表创建可行函数。这些都是参数数目正确的函数,为此有一个隐式转换序列,其中包含实参类型与相应的形参类型完全匹配的情况。
3)确定是否有最佳的可行函数。如果有,则使用它,否则该函数调用出错。
在确定了所有的候选函数后,如何确定最佳可行函数:
从最佳到最差的顺序:
1)完全匹配,但常规函数优先于模板
2)提升转换(如char和short自动转为int,float自动转为double)
3)标准转换(如int到char,long到double)
4)用户定义转换,如类声明中定义的转换。
完全匹配允许的无关紧要的转换:
从实参 到形参
Type Type &
Type & Type
Type [] * Type
Type(argment-list) Type(*)(argument-list)
Type const Type
Type volatile Type
Type * const Type
Type * volatile Type *
非const数据的指针和引用优先于const的指针和引用参数匹配。
错误:
void max(int ,int);
void max(const int,const int); //产生二义性ambiguous
正确:
void max(int ,int);
void max(const int &,const int &);或者void max(const int *,const int *);
例子:
int max(int a,int b)
{
cout<<"max1..."<<endl;
return 0;
}
int max(const int &a,const int &b)
{
cout<<"max2..."<<endl;
return 0;
}
调用:
int a = 32,b = 5;
1)max(a,b); //第一个max版本被调用
2)max(1,2); //产生二义性 const int -> const int & 无关性
const int a = 1; const int b = 2;
3)max(a,b); //产生二义性 const int --> const int & 无关性
两个完全匹配的函数都是模板函数,则较具体的模板函数优先。(最具体指的是编译器推断使用哪种类型时执行的转换最少)