- •Часть 2
- •Часть 2
- •Лабораторная работа №1 Тема: “Простейшие классы”
- •Основные понятия
- •Пример 1: Класс, описывающий окружность.
- •Пример 2: Класс, описывающий точку.
- •Пример 3: Класс, описывающий двумерный массив.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №2 Тема: “Конструкторы и деструкторы”
- •Пример 1: Класс, описывающий животное.
- •Пример 2: Класс, описывающий время.
- •Пример 3: Класс, описывающий двумерный массив.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №3 Тема: “Перегрузка операций”
- •Пример 1: Класс, описывающий окружность.
- •Пример 2: Класс, описывающий прямоугольник.
- •Пример 3: Класс, описывающий строку символов
- •Задания для самостоятельного выполнения
- •Лабораторная работа №4 Тема: “Классы динамических структур” Пример 1: Класс, описывающий двунаправленный список
- •Пример 2: Класс, описывающий бинарное дерево
- •Задания для самостоятельного выполнения
- •Лабораторная работа №5 Тема: “Шаблонные классы”
- •Пример : Класс, описывающий множество.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №6 Тема: “Наследование”
- •Пример 1: Классы, описывающие точку, окружность и конус.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №7 Тема: “Полиморфизм и виртуальные функции”
- •Пример : Классы, описывающие точки и окружности.
- •Задания для самостоятельного выполнения
- •Лабораторная работа №8 Тема: “Разреженные массивы” Пример: Класс, описывающий разреженный массив
- •Задания для самостоятельного выполнения
- •Лабораторная работа №9 Тема: “Виртуальные функции в динамических структурах” Пример: Класс, описывающий базовый класс списка и производный класс стека
- •Задания для самостоятельного выполнения
- •Лабораторная работа №10 Тема: “Вычисление выражений, вводимых с клавиатуры”
- •Пример: Шаблонный класс для вычисления значения выражения, вводимого с клавиатуры
- •Пошаговое выполнение программы
- •Задание для самостоятельного выполнения
Лабораторная работа №3 Тема: “Перегрузка операций”
Перегрузка операторов позволяет в выражениях применять к объектам класса обычные операции, такие как сложение или вычитание.
Перегруженными могут быть практически все операторы, кроме операторов разрешения области видимости, выбора элемента класса, структуры или объединения, условного.
Перегрузка операторов напоминает перегрузку функций и поэтому называется операторной функцией. Однако при этом вводятся некоторые дополнительные правила:
Так как перегружаемый оператор всегда связан с классом, то нельзя переопределять операторы для встроенных типов и нельзя определять дополнительные операторы для встроенных типов;
Нельзя изменять предопределенный приоритет операторов;
Нельзя изменять «-арность» операций, то есть нельзя бинарную операцию сделать унарной или наоборот унарную – бинарной;
Операторная функция может быть перегружена, как и обыкновенная функция с соблюдением правил перегрузки.
Нельзя создавать новых операторов кроме тех, которые определены стандартом С++.
Для операторной функции нельзя задавать стандартные значения параметров.
В общем случае операторная функция объявляется следующим образом:
type operator знак_оператора(список_аргументов);
Часто возвращаемым значением операторной функции является класс, для которого она задана. Однако операторная функция может возвращать любой тип.
Когда операторная функция – член класса перегружает бинарный оператор, для функции достаточно только одного параметра. Этот параметр получит объект, расположенный справа от знака оператора. Объект слева вызывает операторную функцию и передается неявно, посредством использования указателя this.
При создании класса некоторые функции компилятор «подсовывает» по умолчанию. И если Вас не удовлетворяют такие функции, не поленитесь перегрузить их. К таким функциям относится функция присваивания.
Перегрузка унарных операторов напоминает перегрузку бинарных, за исключением того, что мы имеем дело только с одним операндом. Если при этом операторная функция является функцией-членом класса, то у нее не будет параметров. Поскольку имеется только один операнд, он и вызывает операторную функцию.
Иногда нужно объявить два класса, которые так тесно связаны друг с другом концептуально, что хотелось бы обеспечить одному из них неограниченный доступ к членам второго. Проблемы подобного рода в язык С++ решаются через дружественный класс, который имеет доступ как к общим элементам, так и к частным и защищенным элементам класса. Для того, чтобы объявить весь класс или только какую-либо функцию дружественной какому-либо классу используется ключевое слово friend. На еще необъявленный класс можно ссылаться, как на дружественный.
Для перегрузки операторов можно использовать не только функции-члены, но и дружественные функции. При этом необходимо помнить, что в дружественную функцию не передается указатель this. Поэтому в случае бинарного оператора это означает, что дружественной операторной функции явно передаются два параметра, а для унарных операторов требуется один операнд. Все остальное в обоих случаях одинаково. И естественно, при определении дружественной операторной функции вне тела класса не требуется определять область видимости к создаваемому классу.
Перегрузка оператора посредством дружественной функции дает одну очень важную возможность, которой нет у функции – члена класса. Используя дружественную операторную функцию, в операциях с объектами можно использовать встроенные типы данных, которые могут располагаться слева от оператора, что запрещено для функций-членов класса.
Такие свойства дружественной функции делает ее незаменимой для перегрузки операторов ввода/вывода, поскольку в таких операторах левым операндом является объект одного из поточных классов.
