函式多載
C++ 允許在相同範圍內指定多個同名的函式。 這些函式稱為多載函式,將在<多載>中詳細說明。 多載函式可讓程式設計人員根據引數的類型和數目,為函式提供不同的語意。
例如,接受字串 (或 char *) 引數的 print 函式與接受 double 類型引數的相同函式會執行完全不同的工作。 多載允許統一命名,並且可讓程式設計人員不必自創名稱,例如 print_sz 或 print_d。 下表將說明 C++ 使用函式宣告的哪些部分區分在相同範圍內具有相同名稱的函式群組。
多載考量
函式宣告項目 |
是否用於多載? |
---|---|
函式傳回類型 |
沒有 |
引數數目 |
有 |
引數類型 |
有 |
省略符號是否存在 |
有 |
是否使用 typedef 名稱 |
沒有 |
未指定的陣列範圍 |
沒有 |
const 或 volatile (請參閱下方) |
有 |
雖然函式可以依傳回類型加以區別,但無法在這個基礎上多載。如果 Const 或 volatile 在類別中用來套用至類別的 this 指標,而不是函式的傳回類型,則只會做為多載的基礎使用。換句話說,只有在 const 或 volatile 關鍵字接在宣告中函式的引數清單後面時,才適用多載。
範例
下列範例將示範如何使用多載。 預設引數將提供解決相同問題的另一種方式。
// function_overloading.cpp
// compile with: /EHsc
#include <iostream>
#include <math.h>
// 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.
using namespace std;
int main( int argc, char *argv[] )
{
const double d = 893094.2987;
if( argc < 2 )
{
// These calls to print invoke print( char *s ).
print( "This program requires one argument." );
print( "The argument specifies the number of" );
print( "digits precision for the second number" );
print( "printed." );
exit(0);
}
// Invoke print( double dvalue ).
print( d );
// Invoke print( double dvalue, int prec ).
print( d, atoi( argv[1] ) );
}
// Print a string.
int print( char *s )
{
cout << s << endl;
return cout.good();
}
// Print a double in default precision.
int print( double dvalue )
{
cout << dvalue << endl;
return cout.good();
}
// 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.
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 )
return print( dvalue );
// Scale, truncate, then rescale.
dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *
rgPow10[iPowZero - prec];
cout << dvalue << endl;
return cout.good();
}
上述程式碼示範檔案範圍中 print 函式的多載。
如需有關多載的限制以及多載如何影響 C++ 中其他元素的詳細資訊,請參閱多載。