函数重载
函数重载是指在同一命名空间,可以声明功能相似的同名函数, 但是这些同名函数的形式参数(参数的数量,类型,顺序)必须不同, 函数的返回值不影响,可以相同也可以不同
C++函数重载的原理
函数重载是因为c++的函数符号命名规则
下面以g++的编译方式为例 在linux下可以通过objdump -d 查看反汇编代码
int test_func(int a)
{
return a;
}
void func(int a, int b)
{
return;
}
void func(float a, float b)
{
return;
}
反汇编后
int test_func(int a) —->_Z9test_funci
void func(int a, int b) —->_Z4funcii
void func(float a, float b) —->_Z4funcff
可以看到函数符号的命名和函数的名称函数的参数列表均有关, 即当参数列表中形参的类型数量和顺序不同时,函数符号
就会发生改变从而实现重载
另外函数调用时会先进行匹配, 根据重载函数调用匹配规则进行匹配,当匹配到多个或没有找到时会报错
精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;
提升匹配:即整数提升(如bool 到 int、char到int、short 到int),float到double
使用标准转换匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、
int到unsigned int;
使用用户自定义匹配;
使用省略号匹配:类似printf中省略号参数
具体可以看http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html这个博客,不过这个博客中有个错误就是
_Z9test_funci 中Z9不是表示返回值函数重载与返回值无关, 9表示函数名长度
函数重载的好处
- 函数重载可以减少函数名的数量,避免了命名空间的污染,增加代码可读性
- 运算符的重载也是函数重载,同样可以增加代码的可读性
- 类的多种构造函数实现
最后看一个关于const的
1. const修饰非指针类型
void test(const char a)
{
std::cout << "void test(const int a)";
}
void test(char a)
{
std::cout << "void test(int a)";
}
test重定义不等重载
const修饰指针类型
void test(const char a)
{
std::cout << "void test(const int a)";
}
void test(const char * a)
{
std::cout << "test const";
}
void test(char * a)
{
std::cout << "test";
}
const修饰指针类型可以重载
另外 int * const a 也不能用于重载, 此时const修饰的是a指针本身。