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.