木有寸557

 

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 类型的指针复位成空值

posted on 2012-11-05 19:29  小猪_你快跑  阅读(410)  评论(0编辑  收藏  举报

导航