重载函数区分使用不同的初始值设定项的参数类型。因此,对于重载而言,给定类型的参数和对该类型的引用将视为相同。由于它们采用相同的初始值设定项,因此它们被视为是相同的。例如,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 的对象(如标准转换中所述):










