Function_Overloading
什么是函数重载
重载即表明一个词语或短句有多种不同的含义和解释。在计算机领域,重载也表明在同一个作用域内使用相同函数名但参数列表不同的多个函数,可以构成函数重载,使得在调用时根据参数的不同调用不同的函数。
构成重载的条件
参数个数不同
int func(int a) { return 0; }
int func(int a, int b) { return 0; }
以上两个函数构成重载,如果:func(1) 调用的就是第一个函数,func(1, 1) 调用就是第二个函数;通过不同的参数可以在函数名修饰是表述出它们是不同的函数。
参数类型不同
int func(int a) { return 0; }
int func(float a) { return 0; }
以上两个函数构成函数重载,如果:func(1) 则调用第一个函数,func(1.1) 则调用第二个函数。
参数类型顺序不同
int func(char a, int b) { return 0; }
int func(int a, char b) { return 0; }
以上两个函数构成函数重载,若:func('a', 1) 调用的就是第一个函数,func(1, 'a') 调用的就是第二个函数,但不可出现 func(1, 1),这会导致调用不明确,因为 char 类型也隶属整型家族,所以在传参时要注意指明传字符类型,或添加强制类型转换。
特别注意,以下情况不构成函数重载:
int func(int b, char a) { return 0; }
int func(int a, char b) { return 0; }
必须是参数的类型不同,而不是名字。
注意,仅仅返回值不同不能构成函数重载,因为无法通过传参形式来辨别二者不同而决定具体的调用函数。
int func(int a = 1) { return 0; }
int func() { return 0; }
以上两个函数构成函数重载,但如果出现:func() 的调用会报调用不明确的错误。
int func(int a = 1) { return 0; }
int func(int a) { return 0; }
以上两个函数不构成函数重载,缺省参数无特殊性质,这两个函数实际就是一模一样的。
总结
- 函数重载必须遵循:参数类型不同、参数类型顺序不同、参数个数不同,才能构成重载。
- 返回值不同不能构成函数重载。
补充说明
- C++ 能支持函数重载而 C 语言不能的原因是因为二者的函数名修饰规则不一样。C 语言不支持两个同名函数,所以编译阶段就会报错,因为 C 语言的函数名修饰规则为函数名是什么就是什么,但 C++ 会在修饰函数名时加上参数的信息,导致两个函数虽然名字相同但参数不同的情况下修饰出来的名字不同。