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); } |
会输出什么结果呢?答案如下:
因为对参数个数相同的重载函数进行调用时,编译器依次使用下面的规则将实参与形参进行匹配,确定重载函数的调用。
(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); }
|
调用语句
会产生编译错误,因为编译器无法判断第二个实参是空字符串NULL,还是整数0。可见,重载函数的定义和调用会涉及类型转换的细节问题,在设计时要考虑全面。
【责任编辑:
夏书 TEL:(010)68476606】