Перегрузка функций и операторов в С++

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

Перегрузка функций это использование одинаковых имен функций но отличающихся по составу или типам аргументов, таким образом компилятор понимает какую функцию использовать исходя из аргументов функции. В приведенном ниже примере перегружена функция add() для аргументов типа int и std::string.


#include <iostream>                             // std::cout, std::string
int add(int a, int b){                          // Функция сложения целых чисел
    return a + b;
}

std::string add(std::string a, std::string b){  // Функция сложения строк
    return a + b;
}

int main(){
    std::cout << add(5, 3) << '\n';             // 8            add() для целых чисел
    std::cout << add("hi ", "Victor") << '\n';  // hi Victor    add() для строк
}

Следует учитывать что хороший стиль программирования это использование для перегрузки функций похожие действия с аргументами. То есть, если вы перегружаете функцию сложения, с названием add(), то она не должна умножать или делать делить аргументы.

Перегрузка операторов

Перегрузка операторов это назначение для объектов класса на операторы, например +, -, *, /, %, =, [] и т.д. определенных функций. Например в примере ниже мы перегружаем для объектов класса Vector оператор индексации [], после чего мы можем обращаться к объектам класса object через индекс index, object[index].


#include <iostream> // std::cout
class Vector{       // Класс Vector
    int size;       // Размер
    int *data;      // Данные
public:
    Vector(int s):size(s), data(new int[s]){} // Конструктор. Заводим массив на s элементов.
    int& operator [](int index){ // Перегрузка оператора [] для обращения "как к массиву". int& className::operator [](int index){ должно быть в классе
        return data[index];
    }
};

int main(){
    int size = 3;       // Размер массива класса Vector
    Vector vec(size);   // Конструктор объекта vec класса Vector на size элементов
    vec[0] = 7;         // Присваиваем значение
    vec[1] = 5;         // Присваиваем значение
    vec[2] = 3;         // Присваиваем значение
    for(int i = 0; i < size; i++){ // Выводим значения
        std::cout << "vec[" << i << "] = " << vec[i] << "; "; // vec[0] = 7; vec[1] = 5; vec[2] = 3;
    }
}

Хороший стиль программирования это использование для перегрузки операторов действия с объектами подобные действию встроенных в язык С++ операторов. То есть перегрузка оператора + должна делать сложение, а не какие либо другие действия.

2023-10-23



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Ассемблерный листинг С++
Бенчмарки в С++
Рисование в консоли windows на С++
Функции в С++
Параметры функции в С++
Глоссарий С++. Идентификаторы, квалификаторы, модификаторы, объявление, определение и т.д..
Исключения в С++. Выбрасывание и ловля исключения.
Достоинства и недостатки C++
Сборка приложения без IDE C++ с помощью MinGW и Qt
Перегрузка функций и операторов в С++
Случайные числа в С++. Полиномиальная генерация случайных чисел.
Ссылки в С++
Рекурсия в С++. Примеры рекурсивных программ и без использования.
Шаблоны C++
Наименование переменных и стиль программирования
Версия компилятора С++
Время выполнения программы C++