函式多載化
C + + 可讓一個以上的函式的相同範圍中相同名稱的規格。這些稱為多載函式,並在多載中有詳細說明。多載函式讓程式設計人員提供不同的語意,函式,取決於型別和引數數目。
例如, 列印 可接受字串的函式 (或 char *) 引數執行非常不同的工作,比使用型別引數的其中一個 雙。多載允許統一命名,並可避免程式設計人員的名稱例如, print_sz或print_d。下表顯示部分的函式宣告 C++ 的使用來區別相同範圍中同名的函式的群組。
多載化的考量
函式宣告的項目 |
用於多載化嗎? |
---|---|
函式的傳回型別 |
否 |
引數數目 |
是 |
引數的型別 |
是 |
存在或缺乏省略符號 |
是 |
使用typedef名稱 |
否 |
未指定的陣列界限 |
否 |
const 或volatile (如下所示) |
是 |
雖然可以區分函式,傳回型別為基礎的它們不能多載依此進行。Const或volatile僅適用於做為基礎多載化,若要套用至類別中使用這個類別,而不是函式傳回的型別指標。也就是說,多載只適用於 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++ 的詳細資訊,請參閱多載化。