C++ 接收数量不定的函数参数
可以將函數(shù)定義成能夠接受任意數(shù)量的實(shí)參。通過(guò)將省略號(hào)(3個(gè)句點(diǎn)...)寫在函數(shù)定義中形參列表的最后,即可表示調(diào)用該函數(shù)時(shí)可以提供數(shù)量可變的實(shí)參。例如
int sumValues( ?int first, ... ?)
{ ?
// ?Code for the function
}
函數(shù)定義中至少有一個(gè)普通形參,也可以有多個(gè)。省略號(hào)必須放在形參列表的最后。
顯然定義中沒(méi)有關(guān)于可變列表中實(shí)參的類型或數(shù)量的任何信息,因此我們的函數(shù)代碼必須弄清自己被調(diào)用時(shí)接收的事什么。 ? C++庫(kù)在 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;
}
運(yùn)行結(jié)果42
472
main()函數(shù)在兩條輸出語(yǔ)句中調(diào)用了sum( )函數(shù),第一次6個(gè)實(shí)參、第二次9個(gè)實(shí)參 ,每種情況下的第一個(gè)實(shí)參都指定跟著的實(shí)參個(gè)數(shù)。
sum() 函數(shù)有一個(gè)int類型的普通參數(shù),他表示后面跟著的實(shí)參的數(shù)量。形參表中的省略號(hào)表明可以傳遞任意數(shù)量的實(shí)參。有2種方法可以確定調(diào)用該函數(shù)時(shí)有多少實(shí)參:第一是像sum()函數(shù)一樣,用一個(gè)固定的形參指定實(shí)參的數(shù)量;第二是要求最后一個(gè)實(shí)參具有特殊的標(biāo)記值,以便進(jìn)行檢查和確認(rèn)。
? ? ?接下來(lái)再對(duì)程序語(yǔ)句進(jìn)行分析。
va_list arg_ptr; ? ? ?聲明一個(gè)va_list 類型的指針, va_list 類型在stdarg.h頭文件中定義的,該指針用來(lái)依次指向各個(gè)實(shí)參。
va_start( arg_ptr , count ); va_start 宏用來(lái)初始化arg_ptr,使其指向列表中第一個(gè)實(shí)參。
for( int i=0; i<count; i++ )
sum += va_arg( arg_ptr, int ); ? 宏 va_arg返回 arg_ptr指向的位置存儲(chǔ)的實(shí)參值,并使arg_ptr遞增,指向下一個(gè)實(shí)參值。 宏va_ptr的第二個(gè)實(shí)參是第 一個(gè)實(shí)參的類型,決定著我們得到的數(shù)值以及va_arg 遞增的方式。
va_end( arg_ptr ); 宏va_end 將傳遞給他的實(shí)參——va_list 類型的指針復(fù)位成空值
轉(zhuǎn)載于:https://www.cnblogs.com/ATMvip/archive/2012/11/05/2755752.html
總結(jié)
以上是生活随笔為你收集整理的C++ 接收数量不定的函数参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Nhibernate3.3.3 GA使用
- 下一篇: C++中固定长度短字符串比较是否相同,忽