Перегрузка функций

C++ позволяет определять несколько функций с одинаковым именем в одной области. Такие функции называются перегруженными и подробно описываются в разделе "Перегрузка". Перегруженные функции позволяют программистам указывать для функций разную семантику в зависимости от типов и числа аргументов.

Например, функция print, принимающая строковый аргумент (или char *), выполняет задачи, совершенно отличающиеся от задач, выполняемых функцией, принимающей аргумент типа double. Перегрузка позволяет использовать универсальные имена и препятствует применению программистами таких имен, как print_sz или print_d. В следующей таблице указаны компоненты объявления функций, используемые языком C++ для различения групп функций с одинаковым именем в одной области.

Заметки по перегрузке

Элемент объявления функции

Использование для перегрузки

Тип возвращаемого функцией значения

Нет

Число аргументов

Да

Тип аргументов

Да

Наличие или отсутствие многоточия

Да

Использование имен typedef

Нет

Незаданные границы массива

Нет

const или volatile (см. ниже)

Да

Хотя функции можно различать по типам возвращаемых значений, они не могут быть перегружены на этой основе. Элементы Const и volatile служат в качестве основы для перегрузки только при использовании в классе для применения к его указателю this, а не к типу возвращаемого функцией значения. Другими словами, перегрузка применяется, только если ключевое слово const или volatile следует за списком аргументов функции в объявлении.

Пример

В следующем примере показано использование перегрузки. Другой способ решения этой проблемы представлен в разделе Аргументы по умолчанию.

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

В приведенном выше коде отображается перегрузка функции print в области видимости файла.

Сведения об ограничениях по перегрузке и ее влиянии на другие элементы C++ см. в разделе Перегрузка.

См. также

Ссылки

Объявления функций