Java中的可变参数其实就是数组,对C++的可变参数比较好奇,所以上网查了资料,了解下!
首先,C++中可变参数的定义:
void function(...)
我们一般会在参数中定义可变参数的个数,所以有以下形式:
void function(int num ...)
我在Visual Studio 2010下试验过void function(int num, ...)也能正常编译。
下面先看一个例子:
#include <iostream>
#include <cstdarg>
using namespace std;
void print(int num ...)
{
va_list ap;
va_start(ap, num);
for (int i = 0; i < num; i++)
{
cout<<va_arg(ap,int)<<endl;
}
va_end(ap);
}
int main()
{
print(9,1,2,3,4,5,6,7,8,9);
return 0;
}
结果如下:
1
2
3
4
5
6
7
8
9
请按任意键继续...
在使用可变参数时必须要用到三个库函数va_start()、va_arg()和va_end()。使用这三个函数时,必须包含“stdarg.h”(C风格)或者“cstdarg”(C++风格)。
首先,要定义一个va_list类型的变量,如实例中的ap。va_list与int,float类同,它是C++系统预定义的一个数据类型,只有通过这种类型的变量才能从实参表中取出可变参数。
va_start()函数具有两个参数,第一个参数时va_list类型的变量,第二个参数是省略号“...”前面的变量名。该函数的作用是初始化参数个数可变的函数,为取第一个可变的参数做好准备。
函数va_arg()也具有两个参数,第一个参数与函数va_start()的第一个参数相同,第二个参数应该是一个C++中预定义的数据类型,如实例中int。该函数的作用是将第一个参数所指向的可变参数转换成由第二个参数所指定的类型的数据,并将该数据作为函数va_arg()的返回值,同时使va_arg()的第一个参数指向下一个可变的参数,为取下一个可变参数做好准备。
函数va_end()只有一个参数,该参数必须与函数va_start()的第一个参数相同。该函数的作用是做好取可变实参的收尾工作,以便参数个数可变的函数能够正常返回。
使用可变参数的函数要注意一下几点:
(1)定义函数时,固定参数部分放在参数表的前面,省略号“...”表示可变参数。
(2)必须使用函数va_start()来初始化可变参数,为取第一个可变参数做好准备工作;使用函数va_arg()依次取各个可变参数值;最后用函数va_end()做好结束工作,以便能正确地返回。
(3)在调用参数个数可变的函数时,必定有一个参数指明可变参数的个数或总的参数个数。