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

  • 相关阅读:
    Oracle数据库之SQL基础和分支循环
    Oracle数据库基础--存储过程和函数
    oracle 子查询中null的问题(in 和 not in)
    Oracle伪列rownum
    Java基础之I/O流
    Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)
    java基础之容器、集合、集合常用方法
    Java基础之常用类
    电子宠物加强版
    SIGAI机器学习第九集 数据降维2
  • 原文地址:https://www.cnblogs.com/ATMvip/p/2755752.html
Copyright © 2020-2023  润新知