函数名完全相同,但参数个数,参数类型和顺序不同的函数,彼此构成函数重载.C语言不支持函数重载.
规则
- 函数名相同
- 参数个数不同,参数类型不同,参数顺序不同.
注意
- 返回值类型与函数重载无关
int fun() {}
float fun() {}
这两个函数不能构成函数重载.会报错.因为引起了 歧义,二义性.
int fun(int a) {}
float fun() {}
函数名相同,参数个数不同,这两个行数构成重载.与返回值无关.
void display(long a){}
void display(int a){}
void display(double a){}
dispaly(10)//void display(int a)
dispaly(10L)//void display(long a)
dispaly(10.0)//void display(double a)
此时以上三个函数构成重载.
void display(long a){}
void display(double a){}
dispaly(10)
此时报错,参数的隐式转换,导致 二义性,编译器不知道把int 10
转换成long
类型还是double
类型.所以报错.
C++为什么可以支持函数重载
- 采用了
name mangling
或者叫那么decoration
技术 - C++编译器默认会对符号名(比如函数名)进行改编,修饰,有些地方翻译为'命名倾轧'
- 重载时回生成多个不同的函数名,不同编译器(MSVC,g++)有不同的规则.
默认参数
C++允许函数设置默认参数,在调用时可以根据情况省略实参.
规则如下:
- 默认参数只能按照从右到左的顺序
- 如果函数同时又声明,实现,默认参数只能放在函数声明中
- 默认参数的值可以是常量,全局符号(全局变量,函数名)