Funkce přetížení
C++ umožňuje specifikace více funkcí se stejným názvem ve stejném oboru.Tyto se nazývají přetížené funkce a jsou podrobně popsány v Overloading.Přetížená funkce umožňují programátorům poskytnout jinou sémantiku pro funkci, v závislosti na typech a počet argumentů.
Například Tisk funkci, která přebírá řetězec (nebo char *) argument provede velmi odlišné úkoly než ten, který převezme argument typu dvojité.Přetížení umožňuje jednotné pojmenování a zabrání programátoři museli vytvořte názvy jako print_sz nebo print_d.Následující tabulka zobrazuje části deklarace funkce C++ používá k rozlišení mezi skupinami funkcí se stejným názvem ve stejném oboru.
Přetížení úvahy
Funkce prohlášení prvek |
Používá přetížení? |
---|---|
Typ vrácené hodnoty funkce |
Ne |
Počet argumentů |
Ano |
Typ argumentů. |
Ano |
Přítomnost nebo nepřítomnost elipsy |
Ano |
Použít typedef názvy |
Ne |
Indexy pole neurčené |
Ne |
Const nebo volatile (viz níže) |
Ano |
Přestože funkce lze rozlišit na základě návratový typ, nemůže být na tomto základě přetížený.Constnebo volatile jsou používány pouze jako základ pro přetížení, pokud jsou použita ve třídě na této ukazatel třídy není návratový typ funkce.Jinými slovy, přetížení se pouze const nebo volatile klíčové slovo následuje seznam argumentů funkce v prohlášení.
Příklad
Následující příklad ukazuje, jak přetížení lze.Stejný problém vyřešit jiným způsobem je předložena v Výchozí argumenty.
// 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();
}
Předcházející kód ukazuje přetížení print funkce v rozsahu souboru.
Omezení přetížení a informace o přetížení vliv jiných prvků jazyka C++, viz Overloading.