c++函数重载实例讲解
出现在相同作用域中的两个函数,如果具有相同名字而形参列表不同,就称为重载函数,注意,重载函数和返回值无关!!!
在函数中局部声明的名字将会屏蔽在全局作用域内声明的同名名字。
string init ( ) ;
void func ()
{ int init =0; init is local and hides global initl
string s \init ();
}
由此推论,每一个版本的重载函数都应该放在同一个作用于中声明。
void print ( const string &);
void print ( double );
void func ( int ival)
{ void print (int ) ; // new scope:hides previous instances of print;
print ("value");//error : print( const string &)is hidden;
print (ival); // ok
print (3.14);//calls print (int ) ;not print (double);
}
函数确定的三个步骤
void f();
void f (int );
void f (int . int );
void f(double, double =3.14);
f (5.6);
1 候选函数
首先确定该调用所考虑的重载函数的集合,该集合中的函数称为候选函数。
此例中,有四个名为f的候选函数。
2 选择可行函数
可行函数必须满足两个条件,第一,函数的形参个数于调用的实参个数相同;第二,每一个数、惨的类型必须与相应的形参类型匹配,或者可以被隐式转换为相应的行参类型。
对于函数调用f(5.6), 首先排除两个实参个数不匹配的候选函数。没有形参的f和两个int型形参的f函数。
另外,因为有一个函数有默认实参,编译器会自动 将默认实参的值给被忽略的实参,因此某一个调用拥有的实参可能比显式给出的多。
3 寻找最佳匹配
因为f (double ,double)于实参精确匹配,所以编译器会调用这个。关于最佳匹配的原则,会在一会展开讨论。
对于含有多个形参的重载确定
假设有如下函数 f (42,2.56);
在编译器选出可行函数来之后,如果有且仅有一个函数满足下列条件,则匹配成功
(1)其每个实参的匹配都不劣于其他可行函数需要的匹配。
(2)至少有一个实参的匹配优于其他可行函数提供的匹配。
本例中,如果考虑第一个实参,发现f( int , int )匹配精确,但是如果考虑第二个实参,那么f (double ,double)匹配精确,
因此这个调用具有二义性。如果想解决这种二义性,可以通过显式强制转换来实现。
f ( static_cast < double > ( 42 ) , 2.56 ) ; //calls f(double,double)
f ( 42,static_cast < int > ( 2.56) ) ; //calls f ( int ,int ) .
寻找最佳匹配
为了确定最佳匹配,编译器将实参类型到相应形参类型的转换划分等级,转换等级以降序排列如下:
(1)精确匹配。 实参和形参类型相同。
(2)通过类型提升实现的匹配。
(3)通过标准转换实现的匹配。
(4)通过类类型转换实现的匹配。