1.1.4 编译器调用重载函数的规则

2013-10-07 00:17:44 · 作者: · 浏览: 66

1.1.4  编译器调用重载函数的规则

对于重载函数:

void ShowMessage(const char* Text , int Type)
{
printf("Message: Text=%s,Type=%d\n",Text,Type+1);
}
void ShowMessage(const char* Text ,unsigned int Type)
{
printf("Message: Text=%s,Type=%d\n",Text,Type);
}
调用程序段
{
unsigned char i=0; ShowMessage("ok",i); 
}
会输出什么结果呢?答案如下:
Message: Text=ok,Type=1


因为对参数个数相同的重载函数进行调用时,编译器依次使用下面的规则将实参与形参进行匹配,确定重载函数的调用。

(1)具有与实参类型相同的形参的重载函数。

(2)转换实参,将T转换为T&,或T&转换为T,或T转换为const T,然后寻找形参类型匹配的重载函数(T为某数据类型)。

(3)实参进行标准的类型转换,如char→int→unsigned int,然后寻找形参类型匹配的重载函数。

(4)使用构造函数转换实参,使其与某一重载函数匹配。例如,如果类A有构造函数A(int),那么int型的实参可以被编译器转换为类A的临时对象。

(5)使用类型转换函数进行转换,使其与某一重载函数匹配。

显然,上述例子符合第3种情况。又如对于重载函数:

void ShowMessage(const char* Text ,const char* Caption)
{
printf("Message: Text=%s,Caption=%s\n",Text,Caption);
}

void ShowMessage(const char* Text ,unsigned int Type)
{
printf("Message: Text=%s,Type=%d\n",Text,Type);
}

调用语句
 ShowMessage("ok",0);
会产生编译错误,因为编译器无法判断第二个实参是空字符串NULL,还是整数0。可见,重载函数的定义和调用会涉及类型转换的细节问题,在设计时要考虑全面。
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节