「C++」函数重载

  • 函数重载概念

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,常用来处理实现功能类似而数据类型不同的问题

就像在自然语言中一个词有多个意思,需要根据上下文来判断该词的真实含义,既该词被重载了,在C++中编译器也会根据情况来调用同名函数,可以看下面这个实例

int Add(int a,int b)
{
    
    
return a+b;
}

double Add(double a,double b)
{
    
    
return a+b;
}

int main()
{
    
    
Add(1,2);
Add(1.0,2.0);//编译器根据情况自己决定调用哪个函数
}
  • 名字修饰
    在C/
    C++中一个程序要运行起来需要经历这几个阶段:预处理、编译、汇编
    Ca语言和C++的名字修饰规则是不一样的,在C语言中,名称修饰规则特别简单,就是在函数名字前面添加了下划线,而C++因为需要支持函数重载,命名空间等,使得C++的名字修饰规则比较复杂。在C++种采用了一种叫做Name Mangling的机制,Name Mangling是一种在编译过程中将函数、变量的名称重新改编的机制,简单来说就是编译器为了区分各个函数,将函数通过某种算法,重新修饰为一个全局唯一的名称。

  • extern "C"

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。

这个功能主要用在下面的情况:

1、C++代码调用C语言代码

2、在C++的头文件中使用

3、在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到

总的来说本节知识总结为以下几个问题:
1.下面两个函数能形成重载吗?

void fun(int a=10)
{
    
    
cout<<"void fun(int)"<<endl;
}

void fun(int a)
{
    
    
cout<<"void fun(int)"<<endl;
}

不会形成重载,函数重载跟缺省无关,跟类型有关

2.C语言中为什么不能支持函数重载?
因为C语言的名字修饰规则很简单,函数名称一样会导致编译器无法分辨

3.C++中函数重载底层是怎么处理的?
C++利用name mangling(倾轧)技术,来改变函数名,区分参数不同的同名函数

4.C++中能否将一个函数按照C的风格来编译?
可以,在函数前面加extern "C"就可以告诉编译器将该函数按照C语言的规则来编译

猜你喜欢

转载自blog.csdn.net/NanlinW/article/details/103033661