Что такое перезагрузка
Перезагрузка (перегрузка, overloading) — это механизм языка C++, позволяющий определить несколько функций с одним и тем же именем, но с различными наборами параметров. Это даёт возможность использовать единое имя для логически схожих операций, работающих с разными типами или количеством аргументов.
Наборы параметров перезагруженных функций могут отличаться:
- количеством параметров;
- порядком следования параметров;
- типом параметров.
При этом имя функции остаётся одинаковым, а возвращаемый тип должен быть одинаковым для всех перегруженных версий — иначе компилятор не сможет однозначно выбрать нужную функцию при вызове.
Пример
Рассмотрим три перегруженные версии функции test, отличающиеся количеством параметров:
int test(int a)
{
return a;
}
int test(int a, int b)
{
return a + b;
}
int test(int a, int b, int c)
{
return a + b + c;
}
Вызовем каждую из них:
int i = test(1);
qDebug() << i;
i = test(1, 2);
qDebug() << i;
i = test(1, 2, 3);
qDebug() << i;
Получим следующий результат:
1
3
6
Как это работает
Компилятор самостоятельно выбирает нужную функцию на этапе компиляции, анализируя количество и типы переданных аргументов. Этот процесс называется разрешением перегрузки (overload resolution). Если ни одна из перегруженных версий не подходит по аргументам — компиляция завершится ошибкой.
Важные замечания
- Возвращаемый тип должен совпадать у всех перегруженных функций. Нельзя перегружать функцию только по возвращаемому типу — компилятор не сможет различить вызовы:cppint test(int a); // OK double test(int a); // Ошибка: перегрузка только по возвращаемому типу
- Различия только в именах параметров не считаются перегрузкой — важны типы и количество:cppint test(int a); // OK int test(int b); // Ошибка: та же сигнатура
- Перегрузка возможна и по типу параметров:cppint test(int a); int test(double a); int test(const QString &s);
- Неоднозначные вызовы приводят к ошибке компиляции — например, если аргумент можно неявно преобразовать к нескольким типам.
- Перегрузка — механизм времени компиляции (статическое связывание), в отличие от переопределения (override) виртуальных функций, которое работает во время выполнения.
Итог
Перезагрузка функций — удобный инструмент C++, позволяющий давать одно имя нескольким реализациям с разными наборами параметров. Компилятор сам выбирает подходящую версию по аргументам вызова, что делает код более читаемым и выразительным. Главное правило — сигнатуры должны различаться, а возвращаемый тип — совпадать.