四、函数重载和函数指针

函数重载(Function Overload):用同一个函数名定义不同的函数,当函数名和不同的参数搭配时函数的含义不同。

在C语言中,无法实现重载,只能使用函数指针

void func(int a)
{
   cout<<"func"<

1.重载规则

  • 函数名相同。
  • 参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。
  • 返回值类型不同则不可以构成重载。
//函数重载,就是对参数列表的变换,不是函数返回值的变化
//返回值必须一样,参数列表不同,并且函数名相同的函数都是重载函数
//如果说函数重载加上了默认参数,并且函数名相同,就出现二义性
//记住:函数重载最好不要有默认参数
void func(int a);//ok
void func(char a);//ok
void func(char a,int b);//ok
void func(int a, char b);//ok
char func(int a);//与第一个函数有冲突

2.调用准则

编译器调用重载函数的准则:

  • 将所有同名函数作为候选者
  • 尝试寻找可行的候选函数

精确匹配实参

  • 通过默认参数能够匹配实参
  • 通过默认类型转换匹配实参

匹配失败

  • 最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
  • 无法匹配所有候选者,函数未定义,编译失败。

3.重载底层实现(name mangling)

C++利用 name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数。

实现原理:用vcifld表示 **void char int float long double **及其引用。

void func(char a);//func_c(char a)
void func(char a,int b, double c);//func_cid(char a, int b, double c)

4.函数指针

定义函数指针
void func(int a,int b)
{
   cout<

5.重载总结

  • 重载函数在本质上是相互独立的不同函数。
  • 函数的函数类型是不同的
  • 函数返回值不能作为函数重载的依据
  • 函数重载是由函数名和参数列表决定的。

你可能感兴趣的:(四、函数重载和函数指针)