Sdílet prostřednictvím


Přetížení funkcí

Jazyk C++ umožňuje zadat více než jednu funkci stejného názvu ve stejném rozsahu.Takové funkce jsou označovány za přetížené a jsou podrobně popsány v tématu Přetížení.Přetížené funkce umožňují programátorům poskytnout různé sémantiky funkce v závislosti na typech a počtu argumentů.

Například funkce print přijímající argument řetězce (nebo typu char *) provede značně odlišný úkol od funkce přijímající argument typu double.Přetížení umožňuje jednotné pojmenování a zbavuje programátory nutnosti vytvářet názvy jako print_sz nebo print_d.Následující tabulka ukazuje, které části deklarace funkce jazyk C++ používá k rozlišení skupin funkcí stejného názvu ve stejném rozsahu.

Okolnosti přetížení

Prvek deklarace funkce

Použito pro přetížení?

Návratový typ funkce

Ne

Počet argumentů

Ano

Typ argumentů

Ano

Přítomnost nebo absence tří teček

Ano

Použití názvů typedef

Ne

Nespecifikované hranice pole

Ne

const nebo volatile (viz níže)

Ano

Ačkoli funkce lze rozlišit dle návratového typu, nelze je na tomto základě přetížit. Klíčová slova Const nebo volatile se jako základ pro přetížení používají pouze v případě, že jsou použity ve třídě pro ukazatel this této třídy, nikoli návratový typ funkce. Jinými slovy je přetížení platné pouze pokud klíčové slovo const nebo volatile následuje seznam argumentů funkce v deklaraci.

Příklad

Následující příklad znázorňuje, jak lze přetížení použít.Jiný způsob řešení stejného problému je uveden v tématu 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ředchozí kód ukazuje přetížení funkce print v rozsahu souboru.

Informace o omezeních při přetížení a o způsobu, jak přetížení ovlivňuje jiné prvky jazyka C++, naleznete v tématu Přetížení.

Viz také

Referenční dokumentace

Deklarace funkcí