函数重载如何在运行时工作,以及为什么重载?

时间:2014-02-07 00:48:13

标签: c++ runtime switch-statement member overloading

我们假设我有一个名为ClothingStore的课程。该类有3个成员函数,指向访问者到商店的正确部门。会员职能是ChildrenDept,MenDept和WomenDept,取决于访客是儿童,男性还是女性。

函数重载可以用来创建3个具有相同名称的函数,比如PointToDept,但是使用不同的输入参数(child,man,woman)。

程序执行时运行时实际发生了什么?

我的猜测是编译器将switch语句添加到程序中,以选择正确的成员函数。但这让我很奇怪 - 使用重载函数时,在程序性能方面是否有任何好处,而不是使用switch语句创建自己的函数?同样,我对该部分的唯一结论是代码可读性。谢谢。

3 个答案:

答案 0 :(得分:6)

  

我的猜测是编译器将switch语句添加到程序中,以选择正确的成员函数。

这是一个糟糕的猜测。 C ++是一种静态类型语言。变量的类型在运行时不会更改。这意味着决定调用哪个非多态过载是一个总是可以在编译时进行的过载。标准中的第13.3节重载决策确保了这种情况。当在编译时做出决定时,没有理由做出运行时决定。在大多数实现中具有非多态性重载函数的运行时成本为零。唯一的例外可能是C ++解释器。

答案 1 :(得分:5)

  

函数重载如何在运行时工作

没有。它在编译时工作。调用重载函数在运行时与调用非重载函数没有什么不同。

  

为什么超载? ...使用重载函数时,程序性能是否有任何好处,而不是使用switch语句创建自己的函数?

是。与“使用switch语句创建自己的函数”相比,根本没有运行时开销。

答案 2 :(得分:2)

来自Gene的评论:

  

编译器看到三个不同的函数,就好像它们的命名方式不同。

对于大多数编译器,它们的名称不同。这曾经被称为name mangling,其中函数名称以返回类型为前缀,后缀为参数类型。