• C++ 接收数量不定的函数参数


      可以将函数定义成能够接受任意数量的实参。通过将省略号(3个句点...)写在函数定义中形参列表的最后,即可表示调用该函数时可以提供数量可变的实参。例如

            int sumValues(  int first, ...  )

            {  

                //  Code for the function

              }

      函数定义中至少有一个普通形参,也可以有多个。省略号必须放在形参列表的最后。

      显然定义中没有关于可变列表中实参的类型或数量的任何信息,因此我们的函数代码必须弄清自己被调用时接收的事什么。   C++库在 stdarg.h 头文件中定义了va_start、va_arg、va_end宏,可以帮助我们做这件事。

    如下程序

    #include<iostream>
    #include<cstdarg>
    using namespace std;
    int sum( int count, ... )
    {
      if( count <= 0 )
        return 0;
      va_list arg_ptr;                // Declare argument list pointer
      va_start( arg_ptr , count );          // Set arg_ptr to 1st argument

      int sum = 0;
      for( int i=0; i<count; i++ )
        sum += va_arg( arg_ptr, int );     // Add int value from arg_ptr and increment
      va_end( arg_ptr );               // Reset the pointer to null  
      return sum;
    }
    int main( )
    {
      cout << sum( 6, 2, 4, 6, 8, 10, 12 ) <<endl;
      cout << sum( 9, 11, 22, 33, 44, 55, 66, 77, 88, 99 );
      system("pause");
      return 0;
    }

    运行结果42

        472

      main()函数在两条输出语句中调用了sum( )函数,第一次6个实参、第二次9个实参 ,每种情况下的第一个实参都指定跟着的实参个数。

      sum() 函数有一个int类型的普通参数,他表示后面跟着的实参的数量。形参表中的省略号表明可以传递任意数量的实参。有2种方法可以确定调用该函数时有多少实参:第一是像sum()函数一样,用一个固定的形参指定实参的数量;第二是要求最后一个实参具有特殊的标记值,以便进行检查和确认。

         接下来再对程序语句进行分析。

          va_list arg_ptr;      声明一个va_list 类型的指针, va_list 类型在stdarg.h头文件中定义的,该指针用来依次指向各个实参。

          va_start( arg_ptr , count );  va_start 宏用来初始化arg_ptr,使其指向列表中第一个实参。

          for( int i=0; i<count; i++ )
            sum += va_arg( arg_ptr, int );   宏 va_arg返回 arg_ptr指向的位置存储的实参值,并使arg_ptr递增,指向下一个实参值。 宏va_ptr的第二个实参是第                          一个实参的类型,决定着我们得到的数值以及va_arg 递增的方式。

          va_end( arg_ptr );    宏va_end 将传递给他的实参——va_list 类型的指针复位成空值

  • 相关阅读:
    Remove Element
    wso2esb安装及helloworld
    动态布局中RadioGroup的RadioButton有时候不相互排斥的原因
    有关机房收费系统学生下机的思考
    ITOO之底层关系
    POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)
    怎样将「插件化」接入到项目之中?
    授人玫瑰 手留余香 --纪念python3.2.3官方文档翻译结束
    poj 2965 The Pilots Brothers&#39; refrigerator
    怎样使用本文档
  • 原文地址:https://www.cnblogs.com/ATMvip/p/2755752.html
Copyright © 2020-2023  润新知