深度探究C++中的函数重载的用法

2020-01-06 14:34:16王冬梅

重载函数区分使用不同的初始值设定项的参数类型。因此,对于重载而言,给定类型的参数和对该类型的引用将视为相同。由于它们采用相同的初始值设定项,因此它们被视为是相同的。例如,max( double, double ) 被视为与 max( double &, double & ) 相同。声明两个此类函数会导致错误。
出于同一原因,对由 const 或 volatile 修改的类型的函数参数(出于重载的目的)的处理方式与基类没有什么不同。
但是,函数重载机制可以区分由 const 和 volatile 限定的引用和对基类型的引用。此方法可以编写诸如以下内容的代码:

 


// argument_type_differences.cpp
// compile with: /EHsc /W3
// C4521 expected
#include <iostream>

using namespace std;
class Over {
public:
  Over() { cout << "Over default constructorn"; }
  Over( Over &o ) { cout << "Over&n"; }
  Over( const Over &co ) { cout << "const Over&n"; }
  Over( volatile Over &vo ) { cout << "volatile Over&n"; }
};

int main() {
  Over o1;      // Calls default constructor.
  Over o2( o1 );   // Calls Over( Over& ).
  const Over o3;   // Calls default constructor.
  Over o4( o3 );   // Calls Over( const Over& ).
  volatile Over o5;  // Calls default constructor.
  Over o6( o5 );   // Calls Over( volatile Over& ).
}

输出


Over default constructor
Over&
Over default constructor
const Over&
Over default constructor
volatile Over&

指向 const 和 volatile 对象的指针也被认为和指向基类型的指针(以重载为目的)不同。
参数匹配和转换
当编译器尝试根据函数声明中的参数匹配实际参数时,如果未找到任何确切匹配项,它可以提供标准转换或用户定义的转换来获取正确类型。转换的应用程序受这些规则的限制:
不考虑包含多个用户定义的转换的转换序列。
不考虑可通过删除中间转换来缩短的转换序列。
最终的转换序列(如果有)称为最佳匹配序列。可通过多种方式使用标准转换将类型 int 的对象转换为类型unsigned long 的对象(如标准转换中所述):