Перегрузка функций (function overloading) в C++ позволяет определять несколько функций с одним и тем же именем, но с разными параметрами. Это позволяет создавать функции, которые могут обрабатывать различные типы данных или различные количества аргументов.

Основные правила перегрузки функций

  1. Различие в параметрах: Перегруженные функции должны отличаться набором параметров (типами, количеством или порядком параметров). Возвращаемый тип не используется для различения перегруженных функций.
  2. Типы параметров: Компилятор использует типы параметров для разрешения вызовов перегруженных функций.

Примеры перегрузки функций

Пример 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;
}

Важно помнить

  1. Аргументы по умолчанию:

    • Аргументы по умолчанию могут усложнить разрешение перегруженных функций. Компилятор должен однозначно различать перегруженные функции на основе переданных аргументов.
  2. Перегрузка и типы указателей:

    • Перегруженные функции могут различаться по типам указателей и ссылок.

Пример перегрузки с указателями

#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;
}