C++函数重载及原理

函数重载


函数重载是指在同一命名空间,可以声明功能相似的同名函数, 但是这些同名函数的形式参数(参数的数量,类型,顺序)必须不同, 函数的返回值不影响,可以相同也可以不同

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表示函数名长度

函数重载的好处

  1. 函数重载可以减少函数名的数量,避免了命名空间的污染,增加代码可读性
  2. 运算符的重载也是函数重载,同样可以增加代码的可读性
  3. 类的多种构造函数实现

最后看一个关于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指针本身。

猜你喜欢

转载自blog.csdn.net/Jocker_D/article/details/80801138