- •Вопрос 1. Ссылки и ссылочные параметры.
- •Вопрос 2. Перегрузка функций.
- •Вопрос 3. Шаблоны функций.
- •Вопрос 4. Использование const с указателями.
- •Вопрос 5. Область действия класса. Управление доступом к членам класса. Отделение интерфейса от реализации.
- •Вопрос 6. Понятие конструктора .Использование констр-ра с аргументами по умолчанию. Конструктор по умолчанию.
- •Вопрос 7. Понятие деструктора. Когда вызывается конструктор и деструктор.
- •Вопрос 8. Константные объекты и функции-члены.
- •Вопрос 9. Дружественные функции и друж. Классы.
- •Вопрос 10. Указатель this.
- •Вопрос 11. Операции new и delete.
- •Вопрос 12. Статические члены класса.
- •Вопрос 13. Понятие перегрузки операций.
- •Вопрос 14. Функции-операции как члены класса и как друж-е функции
- •Вопрос 15. Перегрузка операций ввода/вывода в поток, бинар и унар операций.
- •Вопрос 17. Перегрузка операций индексации массива.
- •Вопрос 18. Понятие наследования. Механизм ограничения доступа при наследовании.
- •Вопрос 19. Приведение типа указателя базового класса к указателю производного класса и наоборот.
- •Вопрос 21. Конструкторы и деструкторы в производных классах.
- •Вопрос 22. Неявное преобразование объектов производных классов в объекты базового класса.
- •Вопрос 23. Иерархия классов. Уровни наследования.
- •Вопрос 24. Множественное наследование.
- •Вопрос 25. Неопределённость при множ-м наследовании. Включение «классы в классах».
- •Вопрос 26. Понятие виртуальной функции.
- •Вопрос 27. Понятие полиморфизма.
- •Вопрос 28. Абстрактные и конкретные базовые классы.
- •Вопрос 29. Статическое и динамическое связывание.
- •Вопрос 30. Виртуальные деструкторы.
- •Вопрос 31. Шаблоны классов.
- •Вопрос 32. Шаблоны классов и пользовательские типы
- •Вопрос 33. Шаблоны и наследование.
- •Вопрос 34. Классы и объекты потоков ввода/вывода. Иерархия потоковых классов.
- •Вопрос 35, 38. Предопределённые потоковые объекты. Состояние ошибок потока.
- •Вопрос 36. Манипуляторы потоков.
- •Вопрос 37. Неформатированный ввод/вывод с помощью read/ write
- •Вопрос 38. Состояние ошибок ввода/вывода
- •Вопрос 39. Понятие исключения. Когда должна использоваться обработка исключений.
- •Вопрос 40. Генерация исключений. Повторная генерация исключений.
- •Вопрос 41. Перехват исключений.
- •Вопрос 42. Спецификация исключений. Обработка неожиданных исключений.
- •Вопрос 43. «Раскручивание» стека. Иерархия исключений стандартной библиотеки.
- •Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.
- •Вопрос 45. Обработка неуспешного выполнения new.
- •Вопрос 46. Класс auto_ptr и динамич выделение памяти.
- •Вопрос 47. Static_cast, reinterpret_cast
- •Вопрос 48. Инфо о типе времени выполнения. Оператор dynamic_cast
- •Вопрос 49. Ключевое слово explicit.
- •Вопрос 50. Ключевое слово mutable.
- •Вопрос 51. Указатели на члены класса.
- •Вопрос 52. Множественное наследование. Виртуальные базовые классы.
- •Вопрос 53. Классы-контейнеры и классы-итераторы.
- •Вопрос 54. Понятие ооп. Три условия ооп-программы. Парадигмы ооп.
- •Вопрос 55.Основные составляющие объектного подхода: абстрагирование, инкапсуляция, модульность.
- •Вопрос 56. Основные составляющие объектного подхода: иерархия, типизация, полиморфизм.
- •Вопрос 57. Природа объекта. Состояние, поведение, идентичность объекта.
- •Вопрос 58. Отношения между объектами. Связи. Агрегация.
- •Вопрос 59. Природа классов. Отношения между классами. Типы отношений.
Вопрос 13. Понятие перегрузки операций.
Большинство операторов могут быть перегружены, в рез-те чего они получат специальное значение по отн-ю к определённым классам. Когда опер-р перегружен, ни одно из его исходных значений не теряет смысла. Просто для опред-го класса объектов определён новый оператор.
Общая форма записи (для функции-члена):
тип имя_класса::operator#(список_аргументов)
{ … }
Чтобы использовать операцию над объектами классов, эта операция должна быть перегружена, но есть два исключения. Операция присваивания (=) может быть использована с каждым классом без явной перегрузки. По умолчанию операция присваивания сводится к побитовому копированию данных-элементов класса. Операция адресации (&) также может быть использована с объектами любых классов без перегрузки; она просто возвращает адрес объекта в памяти. Но операцию адресации можно также и перегружать.
Цель перегрузки операций: обеспечение кратких выражений для типов, определенных пользователем. Перегрузка операций не выполняется автоматически; Иногда эти функции лучше сделать функциями-элементами, иногда — функциями-друзьями, а случается, что лучше не делать их ни элементами, ни друзьями.
Большинство операций можно перегружать. Нельзя перегрузить (.)(::)(?:)(->) т.к. главное не значение, а имя.
Св-ва:
Изменить кол-во операндов, к-ое берет операция, невозможно: перегруженные унарные операции остаются унарными, перегруженные бинарные операции остаются бинарными.
Создавать новые операции невозможно; перегружать можно только уже существующие операции.
Нельзя изменить с помощью перегрузки операции смысл работы операции с объектом встроенного типа. Перегрузка операций применима только для работы с объектами типов, определенных пользователем, или со смесью объектов типов, определенных пользователем, и встроенных типов.
Class myclass{…};
Myclass a,b,c;
A=b+c;//обычная запись
A=operator+(b,c);//функциональная запись
A=b.operator+(c); // ф-я класса
Вопрос 14. Функции-операции как члены класса и как друж-е функции
Перегрузка операций в форме внешних ф-й
Чтобы перегрузить оператор в форме внешней ф-ции, необходимо определить глобальную ф-цию.
class String {
friend String& operator+(const String&, const String&);
private:
char* s; }
String& operator+(const String& s1, const String& s2)
{ .... }
Перегруженная ф-ция выглядит так же, как и любая глобальная ф-ция. Именно для таких случаев и были придуманы друзья. Если бы мы не объявили ф-цию operator+ другом, то она не имела бы доступа к переменной s.
Внешними ф-циями могут перегружаться любые операторы, кроме операторов преобразования, =, [], () и -> — все эти операторы должны перегружаться только ф-циями класса.
Перегрузка операторов в форме функций класса
Синтаксис напоминает обычную перегрузку функций класса, разве что кол-во аргументов уменьшается на 1 по сравнению с формой внешней ф-ции.
class String { private:
char* s;
public:
String& operator+(const String&) const; };
String& String::operator+(const String& s1) const
{ char* s2 = new char[strlen(s1.s) + strlen(s) + 1];
strcat(s2, s1, s);
String newStr(s2);
delete s2;
return newStr; }
Любой оператор может быть перегружен в форме ф-ции класса. Не применяется в случае если:
1. Первый аргумент относится к базовому типу (например, int или double).
2. Тип первого аргумента определен в коммерческой библиотеке, которую нежелательно
модифицировать.