- •Вопрос 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. Природа классов. Отношения между классами. Типы отношений.
Вопрос 15. Перегрузка операций ввода/вывода в поток, бинар и унар операций.
С++ способен вводить и выводить стандартные типы данных, используя операцию поместить в поток » и операцию взять из потока «. Эти операции уже перегружены в библиотеках классов, которыми снабжены компиляторы С++, чтобы обрабатывать каждый стандартный тип данных, включая строки и адреса памяти. Операции поместить в поток и взять из потока можно также перегрузить для того, чтобы выполнять ввод и вывод типов, определенных пользователем. Ф-ция-операция взять из потока (operator>>) получает как аргументы ссылку input типа istream, и ссылку, названную num, на определенный пользователем тип PhoneNumber; ф-ция возвращает ссылку типа istream. Когда компилятор видит выражение
cin » phone в main, он генерирует вызов функции operator>>(cin, phone);
Операция поместить в поток получает как аргументы ссылку output типа ostream и ссылку num на определенный пользователем тип PhoneNumber и возвращает ссылку типа ostream. Функция operator<< выводит на экран объекты типа PhoneNumber. Когда компилятор видит выражение
cout « phone в main, он генерирует вызов функции operator<<(cout, phone);
Ф-ции operator>> и operator<< объявлены в class PhoneNumber не как ф-ции-эл-ты, а как дружественные ф-ции. Эти операции не могут быть Эл-тами, т.к. объект класса PhoneNumber появляется в каждом случае как правый операнд операции; а для перегруженной операции, записанной как ф-ция-эл-т, операнд класса должен появляться слева. Перегруженные операции поместить в поток и взять из потока должны объявляться как дружественные, если они должны иметь прямой доступ к закрытым элементам класса.
Перегрузка унарных операций
Унарную операцию класса можно перегружать как нестатическую ф-цию-эл-т без аргументов, либо как ф-цию, не явл-ся Эл-том, с одним аргументом; этот аргумент д. б. либо объектом класса, либо ссылкой на объект класса. Ф-ции-эл-ты, к-ые реализуют перегруженные операции, д. б. нестатическими, чтобы они могли иметь доступ к данным класса. Напомним, что статические ф-ции-эл-ты могут иметь доступ только к статическим данным-эл-там класса. Унарная операция,(напр. !) , м. б. перегружена как ф-ция с одним аргументом, не являющаяся Эл-том, двумя различными способами: либо с аргументом, к-ый явл-ся объектом (это требует копирования объекта, чтобы побочные эффекты ф-ции не оказывали влияния на исходный объект), либо с аргументом, к-ый явл-ся ссылкой на объект (никакой копии исходного объекта при этом не делается, но все побочные эффекты этой ф-ции оказывают влияние на исходный объект). Если s — объект класса String (или ссылка на объект класса String), то !s трактуется как вызов operator!(s), активизирующий дружественную ф-цию, не являющуюся Эл-том класса String, но объявленную в нем следующим образом:
class String {
friend int operator!( const String &);}
Перегрузка бинарных операций
Бинарную операцию можно перегружать как нестатическую ф-цию-эл-т с одним аргументом, либо как ф-цию, не являющуюся Эл-том, с двумя аргументами (один из этих аргументов д. б. либо объектом класса, либо ссылкой на объект класса).
Вопрос 16. Перегрузка ++ и --.
Всякая ф-я-член имеет неявный аргумент, соответствующий ключ. слову this и являющийся указателем на объект , членом которого служит данная ф-я. => при перегрузке унарных операторов с помощью ф-и-члена нет необх-ти для этой ф-и иметь какие-либо аргументы. Единственный необх. аргумент – указатель на объект.
Для того, чтобы выполнить перегрузку унарного оператора с помощью friend-функции, необходимо исп-ть параметр ссылочного типа.
Различаются префиксная и постфиксная формы операторов ++ и --.
Если ++el, то выз-ся operator++(), иначе operator++(int x), где х принимает зн-е «0».
Все операции инкремента и декремента в префиксной и постфиксной формах могут быть перегружены.
Чтобы перегрузить операцию инкремента для получения возможности использования и префиксной, и постфиксной форм, каждая из этих двух перегруженных ф-ций-операций должна иметь разную сигнатуру, чтобы компилятор имел возможность определить, какая версия ++ имеется в виду в каждом конкретном случае. Префиксный вариант перегружается точно так же, как любая другая префиксная унарная операция.
++dl
он генерирует вызов функции operator++(dl)
прототип к-ой д. б. объявлен в классе Date как дружественный:
friend Date operator++(Date &);
Перегрузка постфиксной формы операции инкремента представляет некоторые трудности, так как компилятор должен быть способен различать сигнатуры перегруженных ф-ций-операций инкремента в префиксной и постфиксной формах. В этом случае, когда компилятор встречает выражение постфиксной формы инкремента генерирует вызов функции
dl.operator++(0)
прототипом которой является Date operator++(int)
NULL (0) в генерируемом вызове функции является чисто формальным значением, введенным для того, чтобы сделать список аргументов ф-ции operator++, используемой для постфиксной формы инкремента, отличным от списка аргументов ф-ции operator++, используемых для префиксной формы инкремента.
Если постфиксная форма операции инкремента реализуется как ф-ция, не явл-ся Эл-том, то, когда компилятор встречает выражение
dl++
он генерирует вызов функции cperator++(dl,0)
прототип которой должен иметь вид
friend Date operator++(Date &, int);
Опять формальный аргумент NULL используется компилятором только для того, чтобы список аргументов ф-ции operator++, к-ая используется для постфиксной формы инкремента, отличался от списка аргументов ф-ции operator++, используемой для префиксной формы инкремента.
Все рассмотренное в этом разделе по отношению к перегрузке операций инкремента в префиксной и постфиксной формах, приложено и к перегрузке операций декремента.