C++作为面向对象语言,其中一个特性就是函数重载(overload)。
在C语言中,如果定义同名函数,以下代码为例:
int func()
{
return 0;
}
int func(int a)
{
return 0;
}
int main()
{
return 0;
}
编译如下:
$ gcc -o test test.c
test.c:9:5: error: redefinition of ‘func’
9 | int func(int a)
| ^~~~
test.c:4:5: note: previous definition of ‘func’ was here
4 | int func()
| ^~~~
提示func这个函数被重复定义,这表明C语言中,函数名是不能重复的。
但上面的代码,用C++来编译:
$ g++ -o test test.cpp
编译通过,没有问题。
所以C++里是可以同名函数的,只要参数列表不同即可,这种机制就叫做函数重载。
有了重载机制可以更灵活的定义函数,将具体调用哪个函数的任务交给编译器,我们只要把功能类似而只是参数不同的函数都使用同一个名字。
除了函数重载,还有运算符重载。指的是,在同一个命名空间内,可以对同样的函数名或操作符名进行多次声明,对每个声明来讲,其使用了不同的函数参数以及拥有不同的定义(实现)。
当调用这种重载的函数或运算符时,根据你使用的函数实参类型和个数,编译器来决定使用最合适的函数定义或操作符定义。
这个编译器判定的过程叫做重载解析,overload resolution。
但要注意的是,只有参数列表可以用来实现函数重载,而返回类型不影响重载。
很明显,函数参数类型信息和个数是调用函数时的输入信息,可以用来判断调用哪个函数合适。
而返回类型是返回执行后的输出信息,没法用来帮助判断应该调用哪个函数。
所以,如果函数名和参数列表相同,只返回值不同,是不能编译通过的。
<
本文探讨了C++中函数重载的机制,如何通过参数列表区分同名函数,并介绍了运算符重载的概念,以及为何返回类型不影响函数重载。还涉及了子类继承中虚函数的重载规则。最后,详细讲解了如何重载C++内置运算符并给出实例。
最低0.47元/天 解锁文章
918

被折叠的 条评论
为什么被折叠?



