c++函数重载

来源:互联网 发布:rc串联电路实验数据 编辑:程序博客网 时间:2024/06/06 10:42

出现在相同作用域中的两个函数,如果具有相同名字而形参列表不同,就称为重载函数,注意,重载函数和返回值无关!!!

在函数中局部声明的名字将会屏蔽在全局作用域内声明的同名名字。

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)通过类类型转换实现的匹配。



0 0
原创粉丝点击