程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 實例講授在C++的函數中變量參數及默許參數的應用

實例講授在C++的函數中變量參數及默許參數的應用

編輯:關於C++

實例講授在C++的函數中變量參數及默許參數的應用。本站提示廣大學習愛好者:(實例講授在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 );

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved