
- •Структура дисциплины
- •Процедурное программирование
- •Объектно-ориентированное программирование
- •Обобщенное программирование
- •На пути к объектно-ориентированному программированию
- •Абстракция сущностей и процедурный язык программирования
- •Абстрактный тип данных
- •Организация класса
- •Определение и объявление класса
- •Члены класса
- •Маркеры доступа
- •Конструкторы
- •Понятие об объекте
- •Организация кода при работе с классами
- •Статические компоненты класса
- •Конструкторы. Детальное рассмотрение
- •Функции getter и setter
- •Виды отношений между классами
- •Отношение зависимость
- •Отношение целое / часть
- •Разработка класса b_1.
- •Конструктор умолчания.
- •Конструктор с параметрами
- •Конструктор копирования.
- •Деструктор
- •Реализация класса b_2_1.
- •Дружественные функции и дружественные классы
- •Особенности применения дружественных функций и классов
- •Перегрузка оператров
- •Перегрузка оператора присваивания
- •Реализация перегруженного оператора присваивания для класса Array
- •Перегрузка оператора индексирования
- •Понятие о константной функции
- •Константный вариант перегруженного оператора индексирования
- •Вычисление смешанных выражений
- •Наследование
- •Структура объекта порожденного класса
- •Доступ к элементам базового класса
- •Конструкторы порожденного класса
- •Порядок создания объекта порожденного класса
- •Перегруженный оператор присваивания порожденного класса
- •Вызов виртуальной функции из тела невиртуальной функции
- •Виртуализация функций не-членов класса
- •Идиома невиртуального интерфейса (nvi)
- •Реализация механизма виртуальных функций
- •Накладные расходы при работе с виртуальными функциями
- •Чисто виртуальные функции. Абстрактные базовые классы
- •Виртуальные деструкторы
- •Автономные и базовые классы
- •Чисто виртуальный деструктор
- •Дублирование подобъектов
- •Конструкторы при виртуальном наследовании
- •Работа с данными при виртуальном наследовании
- •Обработка исключительных ситуаций
- •Завершение или продолжение
- •Распределение обязанностей между разработчиком и клиентом
- •Генерация исключений
- •Объект исключения
- •Раскрутка стека
- •Спецификации исключений
- •Работа с обработчиками
- •Формат обработчика
- •Пример обработки исключений
- •Современная точка зрения на спецификации исключения
- •Шаблоны функций
- •Объявление и определение шаблона функции
- •Примеры объявлений и определений шаблонов функций
- •Инстанцирование шаблона функции
- •Неявное инстанцирование
- •Явное инстанцирование конкретной функции
- •Структура использования шаблона функции с явным инстанцированием
- •Перегрузка шаблона функции
- •Явная специализация шаблона функции
- •Шаблоны классов
- •Использование шаблона класса
- •Наследование и шаблоны
- •Шаблоны классов и отношение включения
- •Рекурсивное использование шаблонов классов
- •Друзья и шаблоны классов
- •Явная и частичная специализация шаблона класса
- •Алгоритмы
- •Алгоритм for_each
- •Функциональные объекты
- •Алгоритм copy
- •Алгоритм sort
- •Термины и определения
- •.Литература
Перегрузка оператров
Перегрузка операторов делает систему встроенных типов языка C++ расширяемой. Это обусловлено тем обстоятельством, что программист может наделять создаваемые им пользовательские типы данных всеми возможностями, которые предусмотрены для встроенных типов. Это обеспечивает аппарат перегрузки операторов.
Перегрузку операторов можно рассматривать как частный случай перегрузки функций.
Рассмотрим ограничения, которые следует учитывать при перегрузке операторов:
-
Перегружать операторы можно только для пользовательских типов; перегружать операторы для встроенных типов недопустимо.
-
Нельзя при перегрузке изменять арность, приоритет и ассоциативность операторов. например, в выражении a * b +c приоритет операторов «*» и «+» не должен зависеть от того к какой категории типов (встроенных или пользовательских) относятся переменные a, b и c/
-
Нельзя вводить новые операторы, например оператор «^».для возведения в степень.
-
Имеются операторы перегрузка, перегрузка которых не допускается. К ним относятся следующие операторы: операторы доступа «.» и «.*», оператор уточнения области видимости «::» и тернарный оператор «?:».
Остановимся на общих элементах синтаксиса перегрузки операторов.
Имя функции, используемой для перегрузки, имеет специальный формат: operator @. Здесь operator – зарезервированное слово языка C++, а @ – перегружаемый оператор.
Пример. Имя функции, используемой для перегрузки оператора присваивания: operator=.
Существуют две разновидности перегружающих функций:
-
Функции – члены класса.
-
Дружественные внешние функции.
Некоторые операторы следует перегружать с помощью функций – членов. К числу таких операторов относятся операторы, изменяющие объект:
-
Оператор присваивания,
-
Инкремент и декремент.
С другой стороны операторы ввода (>>) и вывода (<<) следует перегружать с помощью дружественных функций.
Рассмотрим вопрос о том, как компилятор вызывает функции, перегружающие операторы. Этот вопрос следует рассмотреть отдельно для перегрузки с помощью функций – членов класса и дружественных функций.
Обратимся к конкретному программному коду.
class Complex { public: Complex operator+ (const Complex& rhs) //… }; // Код клиента int main() { Complex c1(1, 3), c2(2, 4); Complex c3 = c1 + c2; // . . . }
Строка кода: Complex c3 = c1 + c2; будет выполняться так, как будто она имеет следующий вид Complex c3 = c1.operator=(c2).
Предположим теперь, что перегрузка оператора + выполняется с помощью дружественной функции.
class Complex { public: friend Complex operator+(const Complex& lhs, const Complex& rhs);
Пусть клиентский код остался без изменения. Тогда рассматриваемая строка клиентского кода будет выполняться так, как будто она имеет следующий вид:
Complex c3 = operator+(const Complex& lhs, const Complex& rhs));
Рассмотрим вопрос о количестве аргументов перегружающей функции. Это вопрос следует рассматривать отдельно для случая, когда перегрузка осуществляется с помощью функции – члена класса и внешней функции.
В первом случае, когда перегрузка выполняется с помощью функции – члена класса количество аргументов перегружающей функции на 1 меньше арности перегружающего оператора, а во втором случае – совпадает с арностью оператора.