亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

實例講解在C++的函數中變量參數及默認參數的使用

2020-05-23 14:10:05
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在C++的函數中變量參數及默認參數的使用,是C++函數入門學習中的基礎知識,需要的朋友可以參考下
 

包含變量參數列表的函數
如果函數聲明中最后一個成員是省略號 (...),則函數聲明可采用數量可變的參數。在這些情況下,C++ 只為顯式聲明的參數提供類型檢查。即使參數的數量和類型是可變的,在需要使函數泛化時也可使用變量參數列表。函數的系列是一個使用變量參數列表的函數的示例。printfargument-declaration-list
包含變量參數的函數
若要訪問聲明后的參數,請使用包含在標準包含文件 STDARG.H 中的宏(如下所述)。

采用數量可變的參數的函數聲明至少需要一個占位符參數(即使不使用它)。如果未提供此占位符參數,則無法訪問其余參數。
當 char 類型的參數作為變量參數進行傳遞時,它們將被轉換為 int 類型。同樣,當 float 類型的參數作為變量參數進行傳遞時,它們將被轉換為 double 類型。其他類型的參數受常見整型和浮點型提升的限制。

使用參數列表中的省略號 (...) 來聲明需要變量列表的函數。使用在 STDARG.H 包含文件中描述的類型與宏來訪問變量列表所傳遞的參數。有關這些宏的詳細信息,請參閱 va_arg、va_copy、va_end、va_start。(處于 C 運行時庫文檔中)。
以下示例演示如何將宏與類型一起使用(在 STDARG.H 中聲明):va_listva_endva_argva_start

// variable_argument_lists.cpp#include <stdio.h>#include <stdarg.h>// Declaration, but not definition, of ShowVar.void ShowVar( char *szTypes, ... );int main() {  ShowVar( "fcsi", 32.4f, 'a', "Test string", 4 );}// ShowVar takes a format string of the form//  "ifcs", where each character specifies the//  type of the argument in that position.//// i = int// f = float// c = char// s = string (char *)//// Following the format specification is a variable // list of arguments. Each argument corresponds to // a format character in the format string to which // the szTypes parameter points void ShowVar( char *szTypes, ... ) {  va_list vl;  int i;  // szTypes is the last argument specified; you must access   // all others using the variable-argument macros.  va_start( vl, szTypes );  // Step through the list.  for( i = 0; szTypes[i] != '/0'; ++i ) {   union Printable_t {     int   i;     float  f;     char  c;     char  *s;   } Printable;   switch( szTypes[i] ) {  // Type to expect.     case 'i':      Printable.i = va_arg( vl, int );      printf_s( "%i/n", Printable.i );     break;     case 'f':       Printable.f = va_arg( vl, double );       printf_s( "%f/n", Printable.f );     break;     case 'c':       Printable.c = va_arg( vl, char );       printf_s( "%c/n", Printable.c );     break;     case 's':       Printable.s = va_arg( vl, char * );       printf_s( "%s/n", Printable.s );     break;     default:     break;   }  }  va_end( vl );}//Output: // 32.400002// a// Test string

上一個示例演示以下重要概念:
在訪問任何變量參數前,必須建立一個列表標記作為類型 va_list 的變量。在前面的示例中,該標記稱為 vl。
使用 va_arg 宏訪問各個參數。必須告知 va_arg 宏要檢索的參數的類型,以便它可以從堆棧中傳輸正確的字節數。如果為 va_arg 指定的大小的類型與通過調用程序提供的類型不同,則結果是不可預知的。
應將使用 va_arg 宏獲取的結果顯式強制轉換為所需類型。
必須調用宏以終止可變參數處理。va_end


默認參數
在許多情況下,函數具有不常使用的參數,因為使用默認值便已足夠。為了解決此問題,默認參數工具允許為函數僅指定在給定調用中有意義的參數。為了闡釋此概念,請考慮函數重載中所示的示例。

// Prototype three print functions.int print( char *s );         // Print a string.int print( double dvalue );      // Print a double.int print( double dvalue, int prec ); // Print a double with a// given precision.

在許多應用程序中,可為 prec 提供合理的默認值,從而消除對兩個函數的需求:

// Prototype two print functions.int print( char *s );          // Print a string.int print( double dvalue, int prec=2 ); // Print a double with a// given precision.

略微更改了 print 函數的實現以反映類型 double 僅存在一個此類函數這一事實:

// default_arguments.cpp// compile with: /EHsc /c// Print a double in specified precision.// Positive numbers for precision indicate how many digits// precision after the decimal point to show. Negative// numbers for precision indicate where to round the number// to the left of the decimal point.#include <iostream>#include <math.h>using namespace std;int print( double dvalue, int prec ) {  // Use table-lookup for rounding/truncation.  static const double rgPow10[] = {    10E-7, 10E-6, 10E-5, 10E-4, 10E-3, 10E-2, 10E-1, 10E0,     10E1, 10E2, 10E3, 10E4, 10E5, 10E6  };  const int iPowZero = 6;  // If precision out of range, just print the number.  if( prec >= -6 && prec <= 7 )   // Scale, truncate, then rescale.   dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *   rgPow10[iPowZero - prec];  cout << dvalue << endl;  return cout.good();}

若要調用新的 print 函數,請使用如下代碼:

print( d );  // Precision of 2 supplied by default argument.print( d, 0 ); // Override default argument to achieve other// results.

使用默認參數時,請注意以下幾點:
默認參數僅在其中省略了尾隨參數的函數調用中使用 - 它們必須是最后的參數。因此,以下代碼是非法的:

int print( double dvalue = 0.0, int prec );

默認參數不能在以后的聲明中重新定義,即使重新定義的參數與原始參數相同也是如此。因此,以下代碼將生成錯誤:

// Prototype for print function.int print( double dvalue, int prec = 2 );...// Definition for print function.int print( double dvalue, int prec = 2 ){...}

此代碼的問題在于定義中的函數聲明重新定義了 prec 的默認參數。
以后的聲明可添加額外的默認參數。
可為指向函數的指針提供默認參數。例如:

int (*pShowIntVal)( int i = 0 );


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲一区二区精品| 欧美激情乱人伦一区| 91深夜福利视频| 国产综合久久久久| 国产精品久久中文| 亚洲国产91精品在线观看| 国产精品av免费在线观看| 日韩专区在线观看| 91国产精品电影| 国产精品扒开腿做爽爽爽的视频| 国产亚洲精品久久久| 成人在线免费观看视视频| 久久视频精品在线| 欧美亚洲成人精品| 欧洲亚洲女同hd| 欧美激情精品久久久久久变态| 中文字幕日韩高清| 一本色道久久88精品综合| 久久久国产影院| 亚洲成人网在线观看| 中文字幕9999| 91精品在线播放| 黑人狂躁日本妞一区二区三区| 亚洲区在线播放| 亚洲国产精品久久久久| 亚洲国产精品va在线观看黑人| 久久亚洲一区二区三区四区五区高| 精品久久久久久久久国产字幕| 精品久久久久久久久久久久| 亚洲欧美一区二区精品久久久| 国产日韩av在线播放| 亚洲精品美女久久久| 欧美成人在线网站| 久久精品99无色码中文字幕| 96sao精品视频在线观看| 国产丝袜一区二区三区免费视频| 全亚洲最色的网站在线观看| 91日本在线视频| 国产成人在线一区| 欧美高清在线观看| 色爱精品视频一区| 日本最新高清不卡中文字幕| 97精品久久久中文字幕免费| 在线观看久久av| 亚洲精品视频中文字幕| 精品久久久久久久久久国产| 中文字幕视频一区二区在线有码| 日韩精品免费看| 成人欧美一区二区三区黑人| 亚洲欧洲免费视频| 亚洲国产精彩中文乱码av在线播放| 91国产高清在线| 国产日韩在线亚洲字幕中文| 亚洲电影免费观看高清完整版在线观看| 中文字幕欧美亚洲| 91sao在线观看国产| 91av在线影院| 亚洲国产精品中文| 精品香蕉在线观看视频一| 久久久久久国产精品美女| 狠狠操狠狠色综合网| 国产一区二区三区在线| 在线视频中文亚洲| 欧美猛少妇色xxxxx| 在线观看日韩欧美| 色妞久久福利网| 国产精品青青在线观看爽香蕉| 欧美另类交人妖| 国产亚洲欧洲黄色| 欧美黄色小视频| 国产成人精品久久二区二区| 亚洲国内高清视频| 欧美激情免费看| 国产99久久精品一区二区永久免费| 成人444kkkk在线观看| 日韩av大片在线| 国产日韩欧美日韩大片| 国产精品人成电影在线观看| 久久久久久久久网站| 日韩中文在线视频| 性夜试看影院91社区| xx视频.9999.com| 国产精品精品久久久| 国产成人免费91av在线| 国产丝袜精品第一页| 亚洲激情在线观看视频免费| 美女啪啪无遮挡免费久久网站| 久久久久久亚洲精品中文字幕| 91精品久久久久久久久久久久久久| 久久成人精品一区二区三区| 日韩av在线一区| 亚洲欧美日韩网| 欧洲成人性视频| 欧美理论片在线观看| 国产精品免费在线免费| 亚洲欧美日韩图片| 7777kkkk成人观看| 亚洲第一网站免费视频| 国产精品久久网| 欧美丰满少妇xxxxx| 久久久久中文字幕| 亚洲欧美精品中文字幕在线| 色妞久久福利网| 欧美疯狂xxxx大交乱88av| 免费99精品国产自在在线| 亚洲精品av在线| 欧美激情视频三区| 久久精品国产久精国产一老狼| 成人免费观看49www在线观看| 日韩电影在线观看永久视频免费网站| 草民午夜欧美限制a级福利片| 色偷偷av亚洲男人的天堂| 激情成人在线视频| 91久久精品美女高潮| 麻豆乱码国产一区二区三区| 海角国产乱辈乱精品视频| 中文字幕欧美精品日韩中文字幕| 日韩av最新在线观看| www亚洲精品| 亚洲自拍高清视频网站| 久热精品视频在线| 日韩免费电影在线观看| 日韩中文字幕免费看| 国产91精品久久久久久久| 国产精品免费看久久久香蕉| 性欧美视频videos6一9| 亚洲深夜福利视频| 一区二区三区日韩在线| 草民午夜欧美限制a级福利片| 亚洲精品视频在线观看视频| 久久精品色欧美aⅴ一区二区| 精品久久中文字幕久久av| 久久精品91久久香蕉加勒比| 夜夜嗨av一区二区三区免费区| 国产精品流白浆视频| 色七七影院综合| 欧美日韩亚洲视频一区| 久久综合色88| 午夜精品美女自拍福到在线| 欧美激情xxxx| 欧美成人一区二区三区电影| 中文字幕无线精品亚洲乱码一区| 九九精品视频在线| 全色精品综合影院| 欧美激情欧美激情在线五月| 国产成人+综合亚洲+天堂| 国产精品色视频| 自拍偷拍亚洲区| 久久中文精品视频| 久久天天躁狠狠躁老女人| 欧美在线视频a| 国产精品网址在线| 国产精品91在线| 亚洲无线码在线一区观看| 一区二区三区高清国产| 欧美成人h版在线观看| 欧美在线观看视频| 国产97色在线|日韩| 91精品国产自产在线| 日韩欧美一区二区三区| 日韩精品视频在线免费观看| 在线精品视频视频中文字幕| 538国产精品一区二区在线| 中文字幕一区二区三区电影|