函数重载

为什么C++要使用函数重载?

在c语言中,没有函数重载,相同功能的函数,可能形参的类型不同就要重新写另一个函数。

int max_int(int a, int b) {
  return a > b ? a : b;
}
double max_double(double a, int b) {
  return a > b ? a : b;
}

在C++中,如果多个函数功能相同,但

  • 参数的类型不同
  • 参数的数量不同
  • 参数的顺序不同(参数类型不一致)

这时就可以使用重载函数,多个函数拥有一样的函数名。便于函数的管理。

note:函数的返回值不作为函数重载的条件。也就是说两个函数的参数类型和数量完全一致,且顺序相同时,返回值类型不同的话,不能使用相同的函数名。因为程序在汇编时,会将函数名(符号)和其所在的地址形成映射关系,在链接的时候可以更快地根据函数名找到函数所在的地址,存放这种关系的是符号表。而在函数在符号表中的符号遵循一套命名规则:函数符号 = _Z + 函数名长度 + 函数名 + 参数列表类型的缩写。

这些函数接收的形参的类型不同,但是功能是一样的,调用这个函数时,编译器就会根据所传类型自动推导要调用的函数,先是编译,后再去链接对应的函数。这个给过程成为重载决策。重载决策是一个有趣的问题。

编译器将实参类型到形参类型的转换划分为几个等级,排序如下:

  1. 精确匹配,包括:
    • 实参类型和形参类型相同
    • 实参从数组类型或函数类型转换成对应的指针类型
    • 向实参添加顶层const或从实参中删除顶层const
  2. 通过const转换实现的匹配
  3. 通过类型提升实现的匹配
  4. 通过算术类型转换或指针转换实现的匹配
  5. 通过类的类型转换实现的匹配

note:顶层const(指针常量) 底层const(指向常量的指针)

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top