【摘要】:在动手写7.5.1中我们展示了参数类型不同的重载函数。函数重载的严格定义到底是什么呢?首先,函数重载发生在相同作用域中。内层作用域中重名函数的定义将会屏蔽外层函数定义。接下来,让我们看一个示例:动手写7.5.3动手写7.5.3展示了一些看似是重载函数,实际上却是重定义函数的例子,编译器会报出如图7.5.3所示的错误:图7.5.3似是而非的函数重定义我们看到上述示例中几种列举的情况都是函数重定义,而非函数重载。
在动手写7.5.1中我们展示了参数类型不同的重载函数。我们知道函数中有返回值,而参数也可以是const的,对于这些元素的区别,编译器会怎么处理呢?函数重载的严格定义到底是什么呢?
首先,函数重载发生在相同作用域中。内层作用域中重名函数的定义将会屏蔽外层函数定义。
动手写7.5.2
动手写7.5.2展示了函数屏蔽,编译器会报出如图7.5.2所示的错误:
图7.5.2 函数屏蔽
我们可以看到,内层的函数声明屏蔽了外层的函数定义,编译器搜索到add的时候就不往外找了,所以尽管全局作用域中定义的函数的参数个数是对的,但编译器也只能找到不可用的函数。
现在我们知道,只有相同作用域中的函数才存在函数重载,而只有返回值不同的函数却不能算是重载函数。这是因为在调用函数的时候,不一定会体现出返回值是什么,有返回值的函数也可以不赋值给变量,所以编译器不知道该调用哪一个函数。(www.xing528.com)
因此,重载函数一定是在同一作用域中形参表不同的函数,但是这里的不同要如何定义也是很微妙的。接下来,让我们看一个示例:
动手写7.5.3
动手写7.5.3展示了一些看似是重载函数,实际上却是重定义函数的例子,编译器会报出如图7.5.3所示的错误:
图7.5.3 似是而非的函数重定义
我们看到上述示例中几种列举的情况都是函数重定义,而非函数重载。不过要注意指针和引用加上const以后,就跟非const有区别了。
最后我们还要注意的一点是,main()函数永远只能有一个,而且不能进行重载。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。