上篇简单介绍了一下函数重载(overloaded)部分,这篇将写个实例来说一下函数重载(overloaded)。
函数重载(overloaded),简单讲就是函数名一样,其它地方不一样(返回类型或参数)。重载可以让同样功能,不同类型的函数有同样的名字。在编程时应该都会有这种苦,就是想函数名如何取。用重载可以减少这种取名代来的痛苦。
函数重载(overloaded)例:
函数重载(overloaded)输出结果:
1 2 3 4 5 6 |
int add 3 2 double add 3 3 double add 6 |
函数重载是如何实现的?名字重组(name mangling)
因为在计算机内部函数都是独立的名字,没有重载。那一定又是编译器帮我们实现的。一般编译器在编译时,会重新为函数取名,将函数返回类型,参数都加入到函数名中,这样就得到了一个新函数,不重名函数。
1 2 3 4 5 6 7 |
int add(int a,int b) double add(double a,double b) double add(double a,double b,double c) //编译后函数名, intaddintint doubleadddoubledouble doubleadddoubledoubledouble |
以上代码只是举例,其时函数编译后不一定是这样,每家编译器厂商会有自己的重命名方式来实现重载。这点程序员并不用太关心,编译器会很好的实现重命名。
刚好引入另一个内容:extern “C”
1 2 3 4 5 6 7 |
extern "C" { int add(int a,int b); //编译后函数名add } int add(int a,int b); //编译后函数名intaddintint 以上编译后的函数名只是举例说明,C++语言编译后函数名会再重组。具体函数名不同编译器会不同,这点C++语言没有强制规定。 |
上面哪段定义大家一定在引用别人的头文件时看见过。特别是在C++和C两个语言混合编程时。这里讲下为什么要有extern “C”。
C语言是没有函数重载特性的语言。
C++语言是有函数重载特性的语言,重载函数实现方式是将函数名进行重组。
将函数定义在extern “C”{}内,就是明确告诉编译器,用C语言方式编译这些函数。
《函数重载overloaded》上有3条评论
评论已关闭。