重载
1.重载与重载解析
•同一作用域中,函数名相同,参数表不同的函数,构成重载关系
void foo (void);
void foo (int n);
void foo (int* p);
char const* foo (int n, double d);
char const* foo (double d, int n);
•重载与返回类型无关,与参数名也无关,相同类型的引用与非引用不构成重载
int foo (void); // 错误
void foo (int& r); // 错误
char const* foo (int d, double n); // 错误
•调用函数时,根据实参与形参的类型匹配情况,选择一个确定的重载版本,这个过程称为重载解析
void foo (void); void foo (int n);
void foo (int* p); int foo (double d);
char const* foo (int n, double d);
char const* foo (double d, int n);
int n; double d;
foo ();
foo (n);
foo (&n);
foo (d);
foo (n, d);
foo (d, n);
//C++规定常量转换优先于升级转换。
// 在转换的过程中存在优先级的问题,升级转换优于标准转换。
//void print(double d1, ...) ;C++规定省略号匹配的优先级最差
#include <iostream>
void print(char c)
{
std::cout << "c = " << c << std::endl;
}
void print(int n)
{
std::cout << "n = " << n << std::endl;
}
int main(int argc, const char * argv[])
{
double d = 10.23;
print(d);
return 0;
}
//调用print函数时需要在重载函数中进行匹配。由于print函数的实参与所有重载函数均不能完全匹配,所以需要进行转换。在转换的过程中,可以将double类型转换成int类型,这被称为标准转换。也可以将double类型转换成char类型,这也被称为标准转换。由于可以转换成两个重载函数,这被称为等差歧义,将出现编译错误。
•函数指针的类型决定其匹配的重载版本
•只有同一作用域中的同名函数才涉及重载问题,不同作用域中的同名函数遵循名字隐藏原则
–void foo (void);
namespace ns1
{
void foo (int a);
namespace ns2
{
void foo (int a, int b);
void bar (void)
{
foo (10, 20);
}
}
void hum (void)
{
foo (30);
}
}
void fun (void)
{
foo ();
}
2.C++换名
•重载是通过C++换名实现的
•换名机制限制了C和C++模块之间的交叉引用