浅析C++的函数重载

来源:互联网 发布:windows截图工具 编辑:程序博客网 时间:2024/06/06 02:25

一.函数重载

通过学习,我们已经知道如何去声明和定义一个函数以及怎样在程序中调用函数。在C++中,支持的另一种函数新特性:重载函数。那么什么是函数重载呢?

函数重载是指在同一作用域内,可以有一组具有相同函数名,参数的个数或参数的类型不同的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做就减少了函数名的数量,提高了程序的可读性。

例如如下表达式
1 + 3
则调用了针对整型数据进行加法操作的函数。

而表达式1.0 + 3.0
则调用了另外一个针对浮点型数据进行加法操作的函数。

我们希望定义一组函数,使它们执行同样的一般性动作,但是应用在不同的参数类型上。

例如假设我们希望定义一个求和函数,如果没有重载一个函数名的能力那么我们就必须为每个函数给出一个惟一的名字。

例如我们可以如下定义一组求和函数:

int Add_int(int x,int y);
double Add_double(double x,double y);
double Add(int x,double y);

int _Add(int x,int y,int z);

但是这些函数都执行了相同的一般性动作,都是用来求和。

这样在C++中,就可以采用重载函数,它们有着相同的函数名,则函数声明为:

int Add(int x,int y);
double Add(double x,double y);
double Add(int x,double y);
int Add(int x,int y,int z);

则在函数调用过程中,根据实参的个数或实参的类型来选取不同的函数实现。

例如:

#include<iostream>using namespace std;int Add(int x,int y){return (x+y);}double Add(double x,double y){return (x+y);}int Add(int x,int y,int z){return (x+y+z);}int main(){cout<<Add(2,3)<<endl;    //结果为5cout<<Add(2.1,3.0)<<endl;   //结果为5.1cout<<Add(2,3,4)<<endl;     //结果为9return 0;}

重要说明:

(1)重载函数必须具有不同的参数个数或不同的参数类型,若只有返回值的类型不同是不行的。

(2)当函数的重载带有默认参数时,应该注意避免二义性,例如:

int fun(int a,int b=0);
int fun(int a);

是错误的。如果有函数调用fun(2)时,编译器无法准确地确定应调用哪个函数。


二.函数重载与extern“C”

在C++程序中,我们可能会遇到这样一个问题:如果 C++程序要调用已经被编译后的C 函数,该怎么办?
假设某个C 函数的声明如下:
void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能
直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
例如:
extern “C”
{
void foo(int x, int y);
⋯ // 其它函数
}

这就告诉C++编译译器,函数foo 是个C 连接,应该到库中找名字_foo 而不是找_foo_int_int。



原创粉丝点击