Udostępnij za pośrednictwem


Przeładowywanie funkcji

C++ umożliwia określenie więcej niż jednej funkcji o tej samej nazwie w tym samym zakresie.Takie funkcje są nazywane funkcjami przeciążonymi i opisano je szczegółowo w temacie Przeciążenia.Przeciążone funkcje umożliwiają deweloperom podanie różnego znaczenia dla funkcji, w zależności od typów i liczby argumentów.

Na przykład funkcja print, która przyjmuje argument typu string (lub char *) wykonuje zupełnie inne zadania niż ta, która przyjmuje argument typu double.Przeciążenie dopuszcza takie same nazwy i powstrzymuje programistów przed wymyślaniem takich nazw jak print_sz lub print_d.W poniższej tabeli przedstawiono, które części deklaracji funkcji język C++ używa do rozróżniania grup funkcji o tej samej nazwie w tym samym zakresie.

Zagadnienia przeciążania

Element deklaracji funkcji

Używany w przeciążaniu?

Typ zwracany przez funkcję

Nie

Liczba argumentów

Tak

Typ argumentów

Tak

Obecność lub brak wielokropka

Tak

Korzystanie z nazw typedef

Nie

Nieokreślone granice tablic

Nie

const lub volatile (patrz poniżej)

Tak

Chociaż funkcje można odróżnić na podstawie zwracanego typu, nie mogą zostać przeciążone na tej podstawie. Const lub volatile są używane tylko jako podstawa do przeciążenia, jeśli są one używane w klasie do zastosowania do wskaźnika this dla tej klasy, a nie typu zwracanego przez funkcję. Innymi słowy, przeciążanie stosuje się tylko wtedy, gdy słowa kluczowe const lub volatile następują po liście argumentów funkcji w deklaracji.

Przykład

Poniższy przykład ilustruje sposób użycia przeciążenia.Inny sposób na rozwiązanie tego samego problemu został przedstawiony w Argumenty domyślne.

// 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();
}

Poprzedni kod pokazuje przeciążenie funkcji print w zakresie pliku.

Aby uzyskać informacje na temat ograniczeń przeciążania i wpływie przeciążenia na inne elementy języka C++, zobacz Przeciążanie.

Zobacz też

Informacje

Deklaracje funkcji