関数のオーバーロード
C++ では、同じスコープ内で同じ名前の複数の関数を指定できます。 これらは、オーバーロードされた関数と呼ばれます。これについては、オーバーロードに関するトピックで詳しく説明します。 オーバーロードされた関数により、プログラマは、引数の種類と数に応じて関数に異なるセマンティクスを指定できます。
たとえば、文字列 (または char *) の引数を受け取る print 関数が実行するタスクは、double 型の引数を受け取る関数とは大きく異なります。 オーバーロードにより、統一性のある名前付けが可能になり、プログラマは print_sz や print_d のような名前を作成する必要がなくなります。 次の表は、同じスコープ内の同じ名前を持つ関数を区別するために、C++ で関数宣言のどの部分が使用されるかをまとめたものです。
オーバーロードに関する考慮事項
関数宣言要素 |
オーバーロードに使用されるかどうか |
---|---|
関数の戻り値の型 |
X |
引数の数 |
○ |
引数の型 |
○ |
省略記号の有無 |
○ |
typedef 名の使用 |
X |
未指定の配列の範囲 |
X |
const または volatile (以下を参照) |
○ |
関数を戻り値の型によって区別することはできますが、戻り値の型に基づいてオーバーロードすることはできません。Const または volatile がオーバーロードの基準として使用されるのは、これらがクラス内で関数の戻り値の型にではなく、クラスの this ポインターに適用されている場合だけです。 つまり、宣言内の関数の引数リストの後ろに const または volatile キーワードが付いている場合にのみ、オーバーロードが適用されます。
使用例
次の例は、どのようにオーバーロードが使用できるかを示しています。 同じ問題を解決する別の方法については、「Default Arguments (既定の引数)」を参照してください。
// 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++ の他の要素への影響については、「オーバーロード」を参照してください。