Перегрузка функций (function overloading) в C++ позволяет определять несколько функций с одним и тем же именем, но с разными параметрами. Это позволяет создавать функции, которые могут обрабатывать различные типы данных или различные количества аргументов.
Основные правила перегрузки функций
- Различие в параметрах: Перегруженные функции должны отличаться набором параметров (типами, количеством или порядком параметров). Возвращаемый тип не используется для различения перегруженных функций.
- Типы параметров: Компилятор использует типы параметров для разрешения вызовов перегруженных функций.
Примеры перегрузки функций
Пример 1: Перегрузка по типу параметров
#include <iostream>
void print(int i) {
std::cout << "Integer: " << i << std::endl;
}
void print(double d) {
std::cout << "Double: " << d << std::endl;
}
void print(const std::string &s) {
std::cout << "String: " << s << std::endl;
}
int main() {
print(42); // Вызов print(int)
print(3.14); // Вызов print(double)
print("Hello"); // Вызов print(const std::string &)
return 0;
}
Пример 2: Перегрузка по количеству параметров
#include <iostream>
void display(const std::string &s) {
std::cout << "Message: " << s << std::endl;
}
void display(const std::string &s, int n) {
std::cout << "Message: " << s << ", Number: " << n << std::endl;
}
int main() {
display("Hello"); // Вызов display(const std::string &)
display("Hello", 42); // Вызов display(const std::string &, int)
return 0;
}
Пример 3: Перегрузка по порядку параметров
#include <iostream>
void calculate(int a, double b) {
std::cout << "Int and Double: " << a << ", " << b << std::endl;
}
void calculate(double a, int b) {
std::cout << "Double and Int: " << a << ", " << b << std::endl;
}
int main() {
calculate(10, 3.14); // Вызов calculate(int, double)
calculate(3.14, 10); // Вызов calculate(double, int)
return 0;
}
Важно помнить
-
Аргументы по умолчанию:
- Аргументы по умолчанию могут усложнить разрешение перегруженных функций. Компилятор должен однозначно различать перегруженные функции на основе переданных аргументов.
-
Перегрузка и типы указателей:
- Перегруженные функции могут различаться по типам указателей и ссылок.
Пример перегрузки с указателями
#include <iostream>
void process(int *p) {
std::cout << "Pointer to int: " << *p << std::endl;
}
void process(double *p) {
std::cout << "Pointer to double: " << *p << std::endl;
}
int main() {
int a = 10;
double b = 3.14;
process(&a); // Вызов process(int *)
process(&b); // Вызов process(double *)
return 0;
}