美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > C++ >

c++函数重载实例讲解

2018-01-28 15:14|来源:未知 |作者:dnzg |点击:

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

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

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

(责任编辑:dnzg)