預設引數
在許多情況下,函式具有引數,因此不常使用的預設值,即已足夠。若要解決這個問題,可以指定只包含函式在呼叫中指定有意義的引數預設引數的設備。若要說明此概念,請考慮在呈現的範例函式多載化。
// 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函式會稍有變更,以反映類型只能有一個這類函式存在的事實雙:
// 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 );