C++函数参数的扩展

c/c++

浏览数:12

2019-9-11

在C语言中,若是函数没有参数,那么则意味着在调用该函数时,接受任意多的参数。在C++中,对函数参数进行一些扩展。
在C++中,在函数声明时,可以为函数提供默认参数。所以,在调用函数时,若是,没有提供参数值,则函数使用默认值。举例代码如下:

#include <stdio.h>
#include <stdlib.h>

int animal ( int num = 0 );

int main ( int argc, char** argv ){

    int panda = 2;
    int sum = 0;

    sum = animal ( );
    printf ( "sum = %d\n", sum );

    system ( "pause" );
    return 0; 
}

int animal ( int num ){

    return num * num;
}

那么输出结果为:

在这段代码中,在调用函数时,并没有为函数提供实参,所以,该函数使用默认值,所以sum的输出结果为0。
既然C++对函数参数进行了扩展,可以对参数设置默认值。那么,由此而引来的问题就是,既然可以在函数声明时指定默认值,是否可以在函数调用时也指定默认值?第二个问题,如果可以在函数定义时也指定默认值,那么如果在函数声明时和函数定义时所指定的默认值不一样,又会出现什么情况?
现在,我们可以先来实验一下第一个问题,函数定义时也指定默认值。

#include <stdio.h>
#include <stdlib.h>

int animal ( int num = 0 );

int main ( int argc, char** argv ){

    int panda = 2;
    int sum = 0;

    sum = animal ( );
    printf ( "sum = %d\n", sum );

    system ( "pause" );
    return 0; 
}

int animal ( int num = 0 ){

    return num * num;
}

这段代码中,我们在函数定义的地方也指定了默认值,那么,调试程序出现了这样的问题,

很明显,程序报错了。所以,这也就意味着我们并不能在函数定义时指定函数的默认值。
那么,若是,函数定义时和函数声明时所设置的默认值不一样会出现什么情况呢?在实验之前,我们通过猜想就可以知道,程序一定报错,因为,程序不接受在函数定义时设置参数默认值,更不要说参数值不一样了。那么,接下来,用程序验证一下:

#include <stdio.h>
#include <stdlib.h>

int animal ( int num = 0 );

int main ( int argc, char** argv ){

    int panda = 2;
    int sum = 0;

    sum = animal ( );
    printf ( "sum = %d\n", sum );

    system ( "pause" );
    return 0; 
}

int animal ( int num = 4 ){

    return num * num;
}

上面这段代码,在函数声明与定义时,我们设置了不同的默认值值,那么运行结果如下:

很明显,程序再次报错了。
所以,如果我们要提供函数的默认值,那么必须:在函数声明时提供函数的默认值。并且,在调用函数时若是没有为函数提供参数值,则函数使用默认值
接下来,总结一下函数默认参数的规则。
第一条,参数的默认值必须从右向左提供。

#include <stdio.h>
#include <stdlib.h>

//int add ( int x, int y = 1, int z = 2 );
int add ( int x, int y = 0, int z );  //error 函数提供默认值要从右向左考虑

int main ( int argc, char** argv ){

    printf ( "value = %d\n", add ( 1 ) );
    //printf ( "value = %d\n", add ( 1, 2 ) );
    //printf ( "value = %d\n", add ( 1, 2, 3 ) );

    system ( "pause" );
    return 0;
}

int add ( int x, int y, int z ){

    return x + y + z;
}

上面这段代码中,我们没有为第一个参数提供默认值,为第二个参数提供了默认值,没有为第三个参数提供默认值,我们看一下代码运行结果:

发现,程序报错了。为什么呢?显然,它违反了第一条规则,参数的默认值必须从右向左提供,显然,上述代码违背了这条规则。它并没有为最右边的参数提供默认参数,反而为第二个参数提供了默认值,所以,这样做,肯定是错的。
那么现在,我们来正确的从右向左对函数参数提供默认值。

#include <stdio.h>
#include <stdlib.h>

int add ( int x, int y = 1, int z = 2 );
//int add ( int x, int y = 0, int z );  //error 函数提供默认值要从右向左考虑

int main ( int argc, char** argv ){

    printf ( "value = %d\n", add ( 1 ) );
    //printf ( "value = %d\n", add ( 1, 2 ) );
    //printf ( "value = %d\n", add ( 1, 2, 3 ) );

    system ( "pause" );
    return 0;
}

int add ( int x, int y, int z ){

    return x + y + z;
}

运行之后我们发现结果是正确的。

第二条,函数调用时使用了默认值,则后续参数必须使用默认值。
C++中还新增量一个新的概念,叫做占位参数。因为,C++为了兼容C语言,也就是说,仅仅做很小的改动,就能让原本在C上运行的程序,在C++下也能跑起来。为此,占位参数的概念就提出来了。那么什么是占位参数呢?就是说,仅仅声明参数类型,却没有参数名的声明。而且,一般情况下,在函数内部无法使用占位参数。

#include <stdio.h>
#include <stdlib.h>

int func ( int x, int ){

    return x;
}

int main ( int argc, char** argv ){

    printf ( "func ( int x, int ) = %d\n", func ( 1, 2 ) );

    system ( "pause" );
    return 0;
}

上面这段代码就使用了占位参数,运行结果如下:

作者:BarnabyRoss