简介

Tips:不允许两个函数除了返回类型外其他所有的要素都相同,即不能基于返回类型的重载。

如果同一作用域内的几个函数名字相同但是形参列表不同,我们称之为重载函数。对于重载的函数,它们应该在形参数量或者形参类型上有所不同。

重载与const形参

1. 顶层const

Tips:一个拥有顶层const形参的函数无法和另一个没有顶层const形参的函数区分开。

  1. // 错误: 重复声明foo(string)函数
  2. void foo(string);
  3. void foo(const string);
  4. // 错误: 重复声明foo(string*)函数
  5. void bar(string*);
  6. void bar(string* const);

2. 底层const

Tips:const引用形参的函数可以和非const引用形参的函数区分开。

如果形参是某种类型的指针或引用,则通过区分其指向的是常量对象还是非常量对象可以实现函数重载:

  1. // 正确
  2. void foo(string&);
  3. void foo(const string&);
  4. // 正确
  5. void bar(string*);
  6. void bar(const string*);

const_cast与重载

Tips:const_cast最常用于重载函数的情景。

  1. // 常量引用的函数版本
  2. const string &shorterString(const string &s1, const string &s2) {
  3. return s1.size() <= s2.size() ? s1 : s2;
  4. }
  5. // 非常量引用的函数版本复用常量引用的函数版本
  6. string &shorterString(string &s1, string &s2) {
  7. const string &r = shorterString(const_cast<const string&>(s1),
  8. const_cast<const string&>(s2));
  9. return const_cast<string &>(r);
  10. }

调用重载函数

调用重载函数时有三种可能的结果:

  • 编译器找到一个与实参最佳匹配的函数,并生成调用该函数的代码
  • 找不到任何一个函数与调用的实参匹配,这时候编译器发出无匹配的错误信息
  • 有多于一个函数可以匹配,但是每一个都不是明显的最佳选择,此时会发生二义性调用的错误