深入剖析C++重载函数的应用

深入剖析C++重载函数的应用,第1张

深入剖析C++重载函数的应用,第2张

重载函数是C++支持的特殊函数,C++编译器对重载函数的判断是C++语言中最复杂的内容之一
首先我们来明确一下重载函数的定义:同一声明域中的函数名相同,但参数表不同,即通过函数的参数表来识别和区分一个特殊函数。

你可能会问,函数为什么要重载?什么时候应该选择函数重载,什么时候不应该?这也是我下面要介绍的。

当要定义一组函数来执行一系列操作,但它们应用于不同的参数类型时。此时,我们可以选择重载该函数。

例如:int z_x_max (int,int);//返回两个整数值;

int ve_max(常量向量< int > &);//返回向量容器中的值;

int matrix _ max(const matrix &);//返回矩阵引用的值;

以上三个函数大致可以描述为判断一组数中的值。对于函数用户来说,他们不关心函数定义的细节,也就是说,他们不关心判断两个整数的大小,也不关心用不同的函数判断数组(向量容器)个数的大小,这是程序设计者的必需品。程序员必须记住并查找每个函数名。函数的重载将程序员从这个问题的复杂性中解放出来,C++提供了这种支持。上述三种比较尺寸的功能可以定义为:

int Max (int,int);//返回两个整数值;

int Max(const vector < int > &);//返回向量容器中的值;

int Max(const matrix &);//返回矩阵引用的值;

是啊!通过参数可以一眼分辨出不同的函数。

同时,函数的重载也有其不适用性。例如,在开发文本编辑器的过程中,会涉及到一系列的光标控制功能,如下:

screen & MoveUp();

screen & MoveDown();

screen & MoveLeft();

screen & MoveRight();

看完这四个函数,不言而喻,它们控制的是光标在屏幕上的位置,也就是上下左右移动光标。如果我现在把它们写成重载函数,每一个都是Screen & Move();;显然,程序员不容易理解。所以在使用函数重载的时候要遵循应用的逻辑,而不是因为它的存在而简单的使用它。程序员不应该强制重载函数。

你有没有想过C++编译器是如何确定你调用的重载中的哪个函数的?即使它们的函数名相同。你可能会毫不犹豫的回答:是通过函数的参数表。其实识别的过程并没有你想象的那么容易,这涉及到参数的分类、参数转换等诸多方面。这里我就一一解释一下。

假设您有以下一组函数:

void S();

void S(int);

void S ( double,double = 1.2);

void S ( const char*,const char *);

void Max ( int,int);

//……

int main()

{

s(2.4);

返回;

}

//S(2.4);和S()的调用;;s(int);S ( double,double = 1.2);S (const char*,const char*)在同一个域中可见。

那么,问题就来了。s(2.4);上面四个函数会调用哪一个?

编译器判断重载函数的第一步是确定调用中考虑的重载函数集,称为candidant函数。候选函数是与被调用函数同名的函数。上面的前四个函数都可以是候选函数(当然也可以是多个函数),只排除Max (int,int)。

编译器判断重载函数的第二步分为两个动作。第一个动作是编译器从第一步选择的候选函数中调出可行函数。可行函数参数的个数与被调用函数参数的个数相同(如S (int)),或者可行函数参数的个数可以更多,但多余的函数参数要有相关的默认值(如S (double,double = 1.2);;第二个动作是根据参数类型的转换规则,将被调用函数的实参转换为候选函数的实参。基于充分利用参数类型转换的原则,换句话说,尽可能使用参数类型转换。当然,候选函数应该是转换的目标。上述函数只有两个是可行的,它们是S(int);;s(双倍,双倍).

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 深入剖析C++重载函数的应用

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情