欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c++函数重载实例讲解

程序员文章站 2022-07-09 22:18:57
出现在相同作用域中的两个函数,如果具有相同名字而形参列表不同,就称为重载函数,注意,重载函数和返回值无关!!! 在函数中局部声明的名字将会屏蔽在全局作用域内声明的同名名字。 s...

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

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

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