33.c/c++程序员面试宝典-函数重载

来源:互联网 发布:win32 串口编程 编辑:程序博客网 时间:2024/06/05 02:22

33.c/c++程序员面试宝典-函数重载

函数重载是指在相同的作用域中,具有相同的名称而形参列表不同的多个函数。通过执行同样的操作,但应用不同形参的一组函数,可以简化程序的实现,使程序更加易懂。


面试题127  函数重载与作用域****


分析:函数重载是指在相同的作用域中,具有相同的名称而形参列表不同的多个函数。一个重载的示例代码如下:

double max(double d1,double d2)   //定义函数max

{

return (d1>d2)?d1:d2;

}

int max(int e1, int e2)  //重载max,不同的参数列表和返回值类型

{

return (e1>e2)?e1:e2;

}

void main()

{

//使用重载的方法

int e=max(10,15);

double d=max(125.1,125.3);

cout<<e<<endl;

cout<<d<<endl;

}

函数重载主要是用在一组操作相似的函数内,以提高程序的可读性。例如对于加法,无论是整型数据相加还是浮点型的数据相加,都是对加法的实现。只不过执行加法的操作数的类型不一样。这时可以使用函数重载的方式。


应当要说明的是,重载的函数之间的操作方式应该是类似的。否则如果add(int,int)函数是整型加法的函数,但在重载的函数add(float,float)中却是浮点型的减法的话,那么会使函数的调用者感到混乱。而这种做法出现的问题是不能靠编译器检查的,只能由编程者进行检查。


一般的作用域规则同样适用于重载函数名。如果局部地声明一个函数,则该函数将屏蔽而不是重载在外层作用域中声明的同名函数。因此,每一个版本的重载函数都应在同一个作用域中声明。函数重载与作用域相互影响的示例代码如下:

void print(const string &);

void print(double);  //重载print函数

void fooBar(int ival)

{

void print(int);

print("value");   //错误,不在print(const string &)作用域

print(ival);   //正确,在print(int)作用域

print(3.14);   //使用print(int),不在print(double)作用域

}

上面代码中,函数fooBar中的print(int)声明将屏蔽print的其他声明,就像只有一个有效的print函数一样,该函数仅带有一个int形参。在这个作用域或嵌套在这个作用域里的其他作用域中,名字print的任何使用都将解释为这个print函数实例。而在函数体外重载的print函数在函数体内都不能使用。


【答案】函数重载是指在相同的作用域中,具有相同的名称而形参列表不同的多个函数。


面试题128  如何进行函数重载的匹配**


分析:函数重载匹配是将函数调用与重载函数集合中的一个函数相关联的过程。通过自动提取函数调用中实际使用的实参与重载集合中各个函数提供的形参做比较,编译器实现该调用与函数的匹配。

函数重载匹配的示例代码如下:

void some_function(int value)  //定义some_function函数

{

value+=value+1;

cout<<value<<enld;

}

void some_function(float value)  //重载some_funciont函数

{

value+=value-1;

cout<<value<<endl;

}

void main()

{

some_function('A');  //用一个char字符调用函数

}

注意:函数的重载匹配结果有一下3种可能:

(1)编译器找到与实参最佳匹配的函数,并生产调用该函数的代码。

(2)编译器找不到形参与函数调用的实参匹配的函数,这种情况下,编译器将给出编译错误信息。

(3)存在多个与实参匹配的函数,但没有一个是明显的最佳选择。这种情况也是,该调用具有二义性。大多数情况下,编译器都可以直接明确地判断一个实际的调用是否合法,如果合法,则应该调用哪一个函数,重载集合中的函数通常有不同个数的参数或无关联的参数类型。


【答案】编译器遇到对重载函数的调用时,必须确定调用哪个 函数,如果没有能找到参数完全匹配的函数,则找一个替代函数。此时编译器将实在参数与所有重载函数的参数做比较,这一过程称为参数匹配。


面试题129  函数重载时如何实现实参的类型转换***


分析:为了确定最佳匹配,编译器将实参类型到相应形参类型转换划分等级。转换等级以降序排列如下:

精确匹配。实参与形参类型相同;

通过类型提升实现的匹配;

通过标准转换实现的匹配;

通过类类型转换实现的匹配。

内置类型的提升和转换可能会使函数匹配产生意想不到的结果。但幸运的是,设计良好的系统很少会包含形参类型很接近的函数。


【答案】在函数重载匹配时,先通过标准转换来实现匹配,如果不行,再通过类类型转换来实现匹配。



0 0
原创粉丝点击