函数重载:在相同作用域,函数名相同,参数列表不同。 以便实现不同数据类型的操作
 
函数重载:函数名相同,返回值可以不同,参数一定不同 (参数个数不同或参数类型不同)
函数重载解析的步骤如下:
 
1.确定函数条用考虑的重载函数的集合,确定函数调用中参数表的属性。
 
2.从重载函数集合中选择函数,该函数可以再(给出参数个数和类型)的情况下用调用中指定的参数进行调用。
 
3.选择与调用最匹配的函数。
 
 
精确匹配:是参与函数参数精确匹配
 
第一种:从左值到右值的转换,引用表示左值
 
#include <list>
void print(list <int> &)
{
"print"
}
//左值到右值的转换
list<int
int
{
// 精确匹配: 没有从左值到右值的转换
"pause");
return
}
 
第二种:从数组到指针的转换
 
int
void putValues(int
{
"putValues(int *)"
}
int
// ...
// 精确匹配: 从数组到指针的转换
"pause");
return
}
 
第三种:从函数导致真的转换
 
int lexicoCompare(const string &, const
typedef int (*PFI)( const string &, const
void
string as[10];
int
{
// ...
sort(as,
sizeof(as) / sizeof
// 精确匹配: 从函数到指针的转换
);
return
}
 
第四种:限定符的转换
 
int a[5] = { 4454, 7864, 92, 421, 938 };
 
int *pi = a;
 
bool is_equal( const int * , const int * );
 
int func( int *parm ) {
 
// pi 和 parm 的精确匹配: 限定修饰转换
 
if ( is_equal( pi, parm ) )
 
// ...
 
return 0;
 
}
 
//pi和parm从int类型指针转换到const int 类型指针 (注意是指针,限定符转换只能应用到指针上) 
前三种转换被称作左值转换
提升的细节:
 
1.unsigned char, char或short型被提升为int型
 
2.float被转换为double类型
 
3.枚举类型被转换为下列能表示所有枚举类型常量的类型之一:int ,unsigned int, long ,unsigned long
 
4.布尔类型被转换为int型
 
 
标准转换细节:
 
1.整值类型转换
 
2.浮点类型转换
 
3.浮点-指针的转换
 
4.指针转换: 整值0到指针类型的转换,或 任意类型的指针到void* 类型的转换
 
5.bool类型的转换: 从任意整形类型,浮点类型,指针类型,枚举类型到bool类型的转换
 
 
类型转换出现的二义性:在调用过程中,编译器不知道要调用那个函数,所以产生二义性
 
extern void manip( long );
extern void manip( float );
int main() {
manip( 3.14 ); // 错误: 二义性
// manip( float ) 也不会好到那里
return 0;
}
 
可以用显示类型转换解决这个问题:
 
manip( static_cast<long>( 3.14 ) ); // manip( long )
 
 
引用:当实参是引用时,该实参是一个左值。
 
实参和引用参数的匹配有两种情况:
 
1.实参是引用参数的合适的初始值->实参是参数的精确匹配
 
2.实参不能初始化引用列表,没有匹配的函数,则实参不能调用该函数,发生错误。
 
 
 
候选函数:
 
在调用点上可见的函数,和声明的同名函数的集合(要在同一个名字空间内)。
 
可行函数:
 
最佳可行函数:
 
1 用在实参上的转换不比调用其他可行函数所需的转换更差
 
2 在某些实参上的转换要比其他可行函数对该参数的转换更好
 
 
转换序列:
 
左值转换------>
 
提升或标准转换----------->
 
限定修饰转换
 
 
 
缺省参数:
 
extern void ff( int );
 
extern void ff( long, int = 0 );
 
int main() {
 
ff( 2L ); // 匹配 ff( long, 0 );
 
ff( 0, 0 ); // 匹配 ff( long, int );
 
ff( 0 ); // 匹配 ff( int );
 
ff( 3.14 ); // 错误: 二义
 
}
 
 










