Partilhar via


Sobrecarga de função

O C++ permite a especificação de mais de uma função do mesmo nome no mesmo escopo. Elas são chamadas de funções sobrecarregadas e são descritas em detalhes em Sobrecarga. As funções sobrecarregadas permitem que os programadores forneçam semânticas diferentes para uma função, dependendo dos tipos e do número de argumentos.

Por exemplo, uma função print que usa um argumento de cadeia de caracteres (ou char *) executa tarefas muito diferentes do que uma função que usa um argumento do tipo double. A sobrecarga permite a nomeação uniforme e impede que os programadores tenham de inventar nomes como print_sz ou print_d. A tabela a seguir mostra quais partes de uma declaração de função C++ usa para diferenciar entre grupos de funções com o mesmo nome no mesmo escopo.

Considerações de sobrecarga

Elemento de declaração de função

Usado para sobrecarga?

Tipo de retorno de função

Não

Número de argumentos

Sim

Tipo de argumentos

Sim

Presença ou ausência de reticências

Sim

Uso de nomes typedef

Não

Limites de matriz não especificados

Não

const ou volatile (veja abaixo)

Sim

Embora as funções possam ser diferentes com base no tipo de retorno, elas não podem ser sobrecarregadas nessa base. Const ou volatile só são usados como base para a sobrecarga se forem usados em uma classe para aplicar o ponteiro this para a classe, não o tipo de retorno da função. Em outras palavras, a sobrecarga se aplica apenas se a palavra-chave const ou volatile seguir a lista de argumentos da função na declaração.

Exemplo

O exemplo a seguir ilustra como a sobrecarga pode ser usada. Outra maneira de resolver o mesmo problema é apresentada em Argumentos padrão.

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

O código anterior mostra a sobrecarga da função print no escopo do arquivo.

Para restrições de sobrecarga e obter informações sobre como a sobrecarga afeta outros elementos C++, consulte Sobrecarga.

Consulte também

Referência

Declarações de função