您的位置:首页 > 编程语言 > C语言/C++

C++复习(三)

2016-01-27 00:00 204 查看

C++函数重载

实际开发中,有时我们要实现的是同一类的功能,只是有些细节不同。例如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、3个双精度数或3个长整数。在C语言中,程序员往往需要分别设计出3个不同名的函数,其函数原型与下面类似:

int max1(int a, int b, int c);  //求3个整数中的最大者

double max2(double a, double b, double c);  //求3个双精度数中最大者

long  max3(long a, long b, long c);  //求3个长整数中的最大者

但在C++中,这完全没有必要。C++允许多个函数拥有相同的名字,只要它们的参数列表不同就可以。这就是函数的重载(Function Overloading)。借助重载,一个函数名可以有多种用途。

参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。

【例4.6】求三个数的最大值:

#include <iostream>

using namespace std;

//函数声明

int max(int, int, int);

double max(double, double, double);

long max(long, long, long);

int main( )

{

    //求三个整数的最大值

    int i1, i2, i3, i_max;

    cin >> i1 >> i2 >> i3;

    i_max = max(i1,i2,i3);

    cout << "i_max=" << i_max << endl;

    //求三个浮点数的最大值

    double d1, d2, d3, d_max;

    cin >> d1 >> d2 >> d3;

    d_max = max(d1,d2,d3);

    cout << "d_max=" << d_max << endl;

    //求三个长整型数的最大值

    long g1, g2, g3, g_max;

    cin >> g1 >> g2 >> g3;

    g_max = max(g1,g2,g3);

    cout << "g_max=" << g_max << endl;

}

//求三个整数的最大值

int max(int a, int b, int c)

{

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

}

//求三个浮点数的最大值

double max(double a, double b, double c)

{

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

}

//求三个长整型数的最大值

long max(long a, long b, long c)

{

    if(b>a) a=b;

    if(c>a) a=c;

    return a;

}

运行结果:

12  34  100↙

i_max=100

73.234  90.2  878.23↙

d_max=878.23

344  900  1000↙

g_max=1000

通过上例可以发现,重载就是在一个作用范围内(同一个类、同一个命名空间等),有多个名称相同但参数不同的函数。重载的结果,可以让一个程序段尽量减少代码和方法的种类。

在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。

说明:参数列表不同包括个数不同、类型不同和顺序不同,仅仅参数变量名称不同是不可以的。

函数的重载的规则:

函数名称必须相同。

参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。

函数的返回类型可以相同也可以不相同。

仅仅返回类型不同不足以成为函数的重载。

函数重载的实现

C++ 代码在编译时会根据参数列表对函数进行重命名,例如,int max(int, int, int) 会被重命名为 _max_int_int_int,double max(double, double, double) 会被重命名为 _max_double_double_double,所以在本质上来说它们还是不同的函数。

C++函数的默认参数

在C++中,定义函数时可以给参数指定一个默认的初始值。调用函数时,可以省略有默认值的参数。也就是说,如果用户指定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。

指定了默认值的参数,称为默认参数。请看下面的例子:

#include<iostream>

using namespace std;

//带默认参数的函数

void func(int n, float b=1.2, char c='@'){

    cout<<n<<", "<<b<<", "<<c<<endl;

}

int main(){

    //为所有参数传值

    func(10, 3.5, '#');

    //为n、b传值,相当于调用func(20, 9.8, '@')

    func(20, 9.8);

    //只为n传值,相当于调用func(30, 1.2, '@')

    func(30);

    return 0;

}

运行结果:

10, 3.5, #

20, 9.8, @

30, 1.2, @

本例定义了一个带有默认参数的函数 func(),并在 main() 函数中进行了不同形式的调用。为参数指定默认值非常简单,直接在形参列表中赋值即可,与定义普通变量的形式类似。

默认参数的值除了使用字面量指定,也可以使用表达式指定,例如:

float d = 10.8;

void func(int n, float b=d+2.9, char c='@'){

    cout<<n<<", "<<b<<", "<<c<<endl;

}

C++规定,默认参数只能放在形参列表的最后,而且一旦为某个参数指定了默认值,那么它后面的所有参数都必须有默认值。实参和形参的传值是从左到右依次匹配的,默认参数的连续性是保证正确传参的前提。

下面的写法是正确的:

void func(int a, int b=10, int c=20){ }

void func(int a, int b, int c=20){ }

但这样写不可以:

void func(int a, int b=10, int c=20, int d){ }

void func(int a, int b=10, int c, int d=20){ }

除了函数定义,你也可以在函数声明中指定默认参数。不过默认参数只能指定一次,在声明中指定了就不能在定义中指定,反过来也一样。请看下面的例子:

#include<iostream>

using namespace std;

void func(int a, int b=10, int c=20);

int main(){

    func(20, 30);

    return 0;

}

//不能再指定默认参数

void func(int a, int b, int c){

    cout<<a<<", "<<b<<", "<<c<<endl;

}

运行结果:

20, 30, 20
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: