默认参数

在大多数情况下,函数有因此不常使用的参数默认值将足够了。 若要解决此问题,默认参数设备允许指定有意义的中给出的调用的那些参数传递给函数。 若要阐释了此概念,请考虑该示例提供在 函数重载、

// 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 );
    

请参见

参考

C++抽象声明