【C++基础学习】C++怎样重载一个函数名

在C++中,可以为两个或多个函数提供相同的名字,只要它们的每个参数表唯一就行:或者是参数的个数不同,或者是参数类型不同。

当一个函数名在一个特殊的域中被声明多次时,编译器按如下步骤解释后续的声明。

(1)如果两个函数的参数表中的参数的个数或类型不同,则认为是重载的。例如:

(2)如果两个函数的返回类型和参数表精确匹配,则第二个声明被视为第一个的重复声明。

参数表的比较过程和参数名无关。

(3)如果两个函数的参数表相同,但是返回类型相同,则第二个声明被视为第一个的错误声明,会被标记为编译错误。例如:

函数的返回类型不足以区分两个重载函数。

(4)如果在两个函数的参数表中,只有缺省实参不同,则第二个声明被视为第一个的重复声明。例如:


Note1:如果两个参数表的区别只在于一个使用了typedef,而另一个使用了与typedef相应的类型,则该参数表不被视为不同。


Note2:当一个参数类型是const或者volatile时,在识别函数是否相同时,并不考虑const和volatile。例如,下列两个声明声明了同一个函数:

参数是const,这只跟函数的定义有关系:它意味着,函数体内的表达式不能改变参数的值。但是,对于按值传递的参数,这对函数的用户是完全透明的:用户不会看到函数对按值传递的实参的改变。将参数声明为const不会改变可以被传递给该函数的实参种类。任何int型的实参都可以被用来调用函数f(const int)。

但是,如果吧const或volatile应用在指针或者引用参数指向的类型上,则在判断函数声明是否相同时,就要考虑const和volatile修饰符。

例如:

Note3:链接指示符extern "C"只能指定重载函数集中的一个函数。例如:包含下列两个声明的程序时非法的:

这主要是由于类型安全链接的问题。

大多数编译系统的底层组件要求每个函数名必须唯一,这是因为大多数链接编辑器都是按照函数名来解析外部引用的。为处理这个问题,每个函数名及其相关参数表都被作为一个唯一的内部名编码(encoded)。编译系统的底层组件只能看到编码后的名字。因为这种编码帮助链接阶段区分程序中的重载函数,所以我们把它称为类型安全链接

这种特殊的编码不适合用户用链接指示符extern "C"声明的函数。这就是为什么在重载函数集合中只有一个函数可以被声明为extern "C"的原因,具有不同的参数表的两个函数会被编辑器视为同一函数。

posted on 2011-09-05 21:34  江南烟雨hust  阅读(459)  评论(0)    收藏  举报

导航