
- •История развития языков программирования
- •Основные свойства объектно-ориентированных языков программирования
- •6. Использование спецификатора void
- •Преобразование стандартных типов данных.
- •Новые операции new, delete, операция расширения области видимости
- •Объявление функций. Аргументы по умолчанию
- •Перегрузка функций
- •Новые возможности по сравнению с Си
- •Объектно-ориентированные особенности языка
- •13. Перегрузка операций
- •14. Дружественные функции
- •15. Сходства и различия классов, структур и объединений.
- •Отличия структур и объединений от классов
- •16. Классы и объекты. Определение класса и области видимости. Опережающее объявление класса
- •17. Использование спецификатора класса памяти static. Статические компоненты класса
- •18. Константные объекты и константные методы
- •19. Неявный указатель this
- •20. Указатели на член класса
- •21. Локальные и вложенные классы
- •22. Специальный вид методов класса - конструкторы и деструкторы.
- •23. Классы, содержащие объекты других классов
- •24. Создание объектов с различным временем жизни
- •25. Массивы объектов класса
- •26. Особенности копирования объектов
- •27. Заготовка класса без наследников
- •28. Пример вектора с неповерхностным копированием.
- •29. Излишнее копирование. Конструктор копии. Операции присваивания.
- •1. Излишнее копирование
- •Конструктор копирования
- •3. Операции присваивания
- •30. Преобразование типов. Стандартные преобразования. Явное преобразование типов
- •Преобразования указателей и ссылок
- •Явные преобразования типов
- •Неявное преобразование типа
- •31. Преобразования абстрактных типов данных (преобразование типов данных, созданных программистом)
- •32. Наследование классов
- •33. Доступ к наследуемым членам класса
- •34. Стандартные преобразования типов при наследовании
- •35. Инициализация объекта порожденного класса. Конструктор копии. Операция присваивания.
- •3. Операции присваивания
- •37. Виртуальные функции. Объявления виртуальных функций. Чисто виртуальные функции
- •Методы(функции)
- •38. Таблица виртуальных функций. Случаи, когда вызов виртуальной функции не будет виртуальным. Виртуальные деструкторы
- •39. Ввод-вывод файлов. Потоки ввода-вывода. Библиотека ввода-вывода (iostream). Группы классов библиотеки ввода вывода
- •40. Краткая характеристика иерархии классов производных от conbuf.
- •Класс conbuf (constrea.H)
- •Функции-элементы
- •41. Иерархия классов производных от ios
- •42. Состояния потока. Ошибки потоков.
- •С каждым потоком связан набор флагов, которые управляют форматированием потока. Они представляют собой битовые маски, которые определены в классе ios как данные перечисления. Манипуляторы
- •Шаблоны и наследование. Шаблоны и конфигурация компиляторов. Достоинства и недостатки шаблонов.
- •Применение try, catch, throw
- •47. Обработка исключительных ситуаций. Обработка завершения. Обработка структурных исключений, заявление исключения, фильтрующие выражение. Исключительные ситуации
- •Обработка исключительных ситуаций
- •48. Стратегии взаимодействия объектов в программе. Программа как система взаимодействующих объектов. Система объектов, управляемых сообщениями
- •1. Программа, как система взаимодействия объектов.
- •49. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграммы классов. Отношения классов: ассоциация, наследование, агрегация, использование.
- •50. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграмма объектов: назначение, отношение между объектами
- •51. Элементы объектно-ориентированного анализа и объектно-ориентированного проектирования. Диаграмма объектов: назначение, отношение между объектами
13. Перегрузка операций
Для обеспечения механизма подобных операций, имеется механизм перегрузки операций. Для перегрузки операций в определении класса должна быть объявлена функция с ключевым словом operator и следующим за этим словом знаком операции. Определение функии выглядит следующим образом:
возвр.значение имя_класса::operator#(список_аргументов)
{
//выполняемые_действия...
}
Вместо значка # ставится знак перегружаемой операции.
Количество операндов у перегружаемой функции определяется тем, какая операция перегружается: одноместная или двухместная, а также наличием неявного аргумента у методов класса.
Point2D Point2D::operator-(Point2D p2)
{
Point2D temp;
temp.x=x-p2.x;
temp.y=this->y-p2.y;
return temp;
}
Когда перегружается бинарная операция, у функции будет только один параметр. Этот параметр получит объект, расположенный справа от знака операции. Объект слева вызывает функцию операции и передается неявно посредством использования указателя this. Важно понимать, что для написания функции операции имеется множество вариантов. Рассмотрим вторую реализацию
Point2D operator-(Point2D p2) const;
//Point2D.cpp
Point2D Point2D::operator-(Point2D p2) const
{
return Point2D(x-p2.x, y-p2.y);
}
Этот метод не изменяет член-данные. Мы не стали создавать явные временные объекты, а воспользовались так называемым анонимным экземпляром. Он существует лишь во время вычисления выражения, в котором он встречается. При перегрузке унарной операции с использованием функции-члена, у функции не будет параметров, поскольку имеется только один вариант, он и вызывает функцию-операцию.
//Point2D.h
Point2D operator-() const;
//Point2D.cpp
Point2D Point2D::operator-() const
{
return Point2D(-x, -y);
}
void main()
{
const Point2D p1(1,2);
Point2D p2(2,3), p3;
(p1-p2).print();//неявный вызов операции минус
p1.operator-(p2).print();//явный вызов
cout<<p1*p2<<”\n”;
(p1-20).print();//будет использоваться операция преобразования типов
}
Надо обратить внимания, что имеется оператор с двумя переменными, выражение p1-20 будет корректно выполняться. В этом случае конструктор автоматически организует вызов конструктора с одним параметром и конструируется для него временный объект. И лишь после этого вызовет функцию-операцию. 2.0-p1 конструироваться не будет, потому что перегруженная операция является методом класса своего первого оператора, а для своего типа данных никакие перегрузки операций недопустимы.
Операции с С++ можно перегружать. Не перегружаются следующие операции:
.
.*
::
? :
sizeof
Можно перегружать + * / % ^ & |~ != <> += -= /= == && || ++ ->* -> [] () new delete
Большинство операций не может быть равно перегрузке. То есть те операции, которые выполняются раньше при перегрузке будут вести себя раньше. Изменить количество оперантов, которые берет на себя операция, невозможно. Перегружаемые унарные операции остаются унарными, а бинарные – бинарными. Нельзя создавать новые операции, можно перегружать только существующие. Нельзя изменить с помощью перегрузки операций смысла работы с переменами встроенного типа.