Объясните что такое срезка или расщепление

Ответы на некоторые вопросы по С++ (4 стр)

111. Какие функции не наследуются?
Конструкторы и operator=

112. Сформулируйте правила написания конструкторов в производном классе.
.

113. Каков порядок вызова конструкторов? А деструкторов?
Порядок конструирования объекта:
базовые виртуальные классы
таблица виртуальных классов
базовые классы
таблица виртуальных функций
члены («поля»)
сам класс

114. Можно ли в производном классе объявлять новые поля? А методы?
Да. Да.

115. Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?
Пользовать BASE::Name

117. Сформулируйте принцип подстановки.
LSP: Subtypes must be substitutable for their base types.

118. Когда выполняется понижающее приведение типов?
Когда у программы плохой дизайн :))

119. Объясните, что такое «срезка» или «расщепление».
Это когда какой-нибудь идиот передает объект в функцию, принимающую базовый класс по значению, класс наследник.

120. Объясните, зачем нужны виртуальные функции.
Для реализации динамического полиморфизма.

121. Что такое связывание?
Определение того какая функция должна быть вызвана.

123. Какие два вида полиморфизма реализованы в С++?
Статический и динамический.

124. Дайте определение полиморфного класса.
Класс с виртуальными функциями.

125. Может ли виртуальная функция быть дружественной функцией класса?
Да.

126. Наследуются ли виртуальные функции?
Да.

127. Каковы особенности вызова виртуальных функций в конструкторах и деструкторах?
Механизм виртуальных функций не работает.

128. Можно ли сделать виртуальной перегруженную операцию, например, сложение?
Да.

129. Может ли конструктор быть виртуальным? А деструктор?
Нет. Да.

130. Как виртуальные функции влияют на размер класса?
Указателем на таблицу виртуальных функций.

131. Как объявляется «чистая» виртуальная функция?
struct A < virtual voif f() = 0; >;

132. Дайте определение абстрактного класса.
Класс содержащий хотя бы одну чисто виртуальную функцию.

133. Наследуются ли чистые виртуальные функции?
Да. (иначе зачем они нужны 🙂 )

134. Можно ли объявить деструктор чисто виртуальным?
Да.

135. Чем отличается чистый виртуальный деструктор от чистой виртуальной функции?
Он обязан иметь определение. (т.к. будет вызван)

136. Зачем требуется определение чистого виртуального деструктора?
Чтобы сделать класс абстрактным.
Наверное правильно было бы ответить и на вопрос:
136.(1) Зачем требуется определение виртуального деструктора?
Чтобы корректно удалять объекты по указателю на базовый класс.

137. Наследуется ли определение чистой виртуальной функции?
Нет.

138. Приведите классификацию целей наследования.
Наследование интерфейса и наследование реализации

139. Объясните разницу наследования интерфейса от наследования реализации.

Источник

Объясните что такое срезка или расщепление

Открытое наследование устанавливает между классами отношение «является»: класс-наследник является разновидностью класса-родителя. И это не просто словесная формулировка — она непосредственно поддерживается компилятором. Когда мы пишем, что класс Derived (производный) открыто наследует от класса Base (базовый), мы сообщаем компилятору, что каждый объект типа Derived является также объектом класса Base. С практической точки зрения это означает, что везде, где может быть использован объект типа Base, вместо него разрешается подставлять объект типа Derived — это и есть принцип подстановки.
Этот принцип работает и для ссылок, и для указателей: вместо ссылки (указателя) на базовый класс может быть подставлена ссылка (указатель) на класс-наследник. Преобразование типа при этом прописывать не обязательно — оно выполняется автоматически. Эккель называет такое приведение типов повышающим.

Обратное — неверно! Например, будильник является часами, но не всякие часы — будильник. Здесь часы — базовый класс, а будильник — производный.

LVV>>13. Объясните, что такое «срезка» или «расщепление».
ST>?
Коротко — в производном классе могут быть определены дополнительные поля. Во время присваивания при преобразовании по принципу подстановки «лишние поля в объект базового класса. естественно, не попадают.

Чтобы понять, в чем дело, обратимся к классам точек. Рассмотрим простой пример с двумерными и трехмерными точками.

Работает принцип подстановки, однако нас поджидает неприятность: так как базовый класс ничего не знает о своих наследниках, то в переменную a копируется только Point2D-часть трехмерной точки. Этот эффект называется срезкой [Страуструп] или расщеплением [Брюс Эккель]; он частенько приводит к ошибкам. Например, при передаче параметра по значению, как мы знаем, работает конструктор копирования, поэтому в таких случаях тоже может произойти срезка. При передаче параметра по ссылке (или по указателю) ничего подобного не происходит.

Источник

Значение слова «расщепление»

Объясните что такое срезка или расщепление. Смотреть фото Объясните что такое срезка или расщепление. Смотреть картинку Объясните что такое срезка или расщепление. Картинка про Объясните что такое срезка или расщепление. Фото Объясните что такое срезка или расщепление

Источник (печатная версия): Словарь русского языка: В 4-х т. / РАН, Ин-т лингвистич. исследований; Под ред. А. П. Евгеньевой. — 4-е изд., стер. — М.: Рус. яз.; Полиграфресурсы, 1999; (электронная версия): Фундаментальная электронная библиотека

Расщепление Эго — психологический процесс.

Расщепление горизонта — метод предотвращения петель маршрутизации.

Расщепление нёба — полное расщепление губы и нёба.

Расщепление голоса — приём пения, при котором к чистому звуку примешивается известная доля другого звука, нередко представляющего собой немузыкальный звук, то есть шум.

Механическое расщепление — метод получения тонких плёнок кристаллов.

Источник: «Толковый словарь русского языка» под редакцией Д. Н. Ушакова (1935-1940); (электронная версия): Фундаментальная электронная библиотека

расщепле́ние

1. только ед. книжн. действие по значению гл. расщепить, расщеплять разделять на части

2. спец. хим. действие по значению гл. расщепиться; расщепляться

3. спец. физ. действие по значению гл. расщепиться; расщепляться ◆ Расщепление ядра. ◆ Расщепление атома.

Делаем Карту слов лучше вместе

Объясните что такое срезка или расщепление. Смотреть фото Объясните что такое срезка или расщепление. Смотреть картинку Объясните что такое срезка или расщепление. Картинка про Объясните что такое срезка или расщепление. Фото Объясните что такое срезка или расщеплениеПривет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!

Спасибо! Я обязательно научусь отличать широко распространённые слова от узкоспециальных.

Насколько понятно значение слова финотдел (существительное):

Источник

Вопросы по С++ возвращаются.

Симпатичная книжка Лаптев В.В. C++. Объектно-ориентированное программирование: Учебное пособие. СПб.: Питер, 2008. 464 с. в конце каждой главы содержит список тестовых вопросов по С++, на которые я решил ответить. Поскольку вопросы относятся к материалу конкретной главы, то ответы на них ограничены пройденным к этому моменту. В ответах могут быть ошибки!

Некоторые вопросы не имеют прямых ответов в тексте (особенно это касается главы 14). Например, вопрос 1 главы 3 о том, почему нельзя перегружать некоторые операции. Немного погуглив, нашёл и ответы, и источник вопросов: Bjarne Stroustrup’s C++ Style and Technique FAQ.

Ну и, неизбежные в любой книге опечатки.

Глава 1. Классы и объекты

1. Что определяет класс? Чем отличается класс от объекта?

Класс определяет новый тип. Объект – переменная этого нового типа, иначе говоря, экземпляр класса. Класс объявляется один раз, а объектов этого класса создаётся столько, сколько необходимо.

2. Можно ли объявлять массив объектов? А массив классов?

3. Разрешается ли объявлять указатель на объект? А указатель на класс?

4. Можно ли совместить определение класса с объявлением объекта?

5. Объясните разницу между определением класса и объявлением класса.

Объявление говорит компилятору, что в программе существует элемент с указанным именем. Определение указывает какой код или данные соответствуют этому имени. Поэтому определение должно быть уникальным, для объявлений это необязательно. Определение класса позволяет объявлять объекты этого класса, а объявление класса – нет.

6. Объясните, чем различаются два объявления указателя:

В первом случае выделяемая память инициализируется «мусором», во втором – нулями.

7. Как называется использование объекта одного класса в качестве поля другого класса?

Включение или композиция.

8. Является ли структура классом? Чем класс отличается от структуры?

Да. В классе все поля по умолчанию приватны, а в структуре – публичны.

9. Какие ключевые слова в C++ обозначают класс?

10. Объясните принцип инкапсуляции.

Сокрытие деталей реализации класса.

Ключевое слово public открывает доступ извне к полям класса, а слово private — закрывает. Да.

12. Существуют ли ограничения на использование ключевых слов publiс и private в классе? А в структуре?

13. Обязательно ли делать поля класса приватными? Как инициализировать приватные поля класса?

Нет. С помощью публичных методов.

14. Что такое «метод»? Как вызывается метод? Может ли метод быть приватным?

Метод – это функция, определённая в классе. Обычный метод method вызывается для объекта класса (object.method()), статический метод вызывается для класса (class.method()). Да

15. Как определить метод непосредственно внутри класса? А вне класса?

Внутри – также, как обычную функцию. Вне – с помощью префикса – имени класса в заголовке определения метода: class::method().

16. Объясните, что понимается под интерфейсом класса.

Открытая (публичная) часть класса.

Ключевое слово this является указателем на объект, для которого вызван метод. Значение *this можно использовать для работы с текущим объектом.

18. Что такое композиция?

Использование объекта одного класса в качестве поля другого класса.

19. Разрешается ли внутри метода объявлять объекты «своего» класса? Как присваивать таким объектам начальное значение?

20. Сколько места в памяти занимает объект класса? Как это узнать?

21. Каков размер «пустого» объекта? Влияют ли методы на размер объекта?

«Пустой» объект – это объект «пустого» класса. Размер такого объекта равен 1 char (в 32-битном gcc). Размер принят ненулевым, чтобы убедиться, что два разных объекта будут иметь разные адреса. Методы на размер объекта не влияют.

22. Одинаков ли размер класса и аналогичной структуры?

23. Что такое выравнивание и от чего оно зависит? Влияет ли выравнивание на размер класса?

Выравнивание – это способ размещения данных в памяти особым образом для ускорения доступа. Оно зависит от реализации компилятора, ОЗУ и процессора, установок режимов компилятора и компоновщика. Выравнивание влияет на размер класса.

24. Покажите, как осуществить выравнивание полей класса по границе двух байтов.

25. Разрешается ли параметрам методов присваивать значение по умолчанию?

26. Объясните, почему методы, реализующие бинарные операции (например, сложение), должны иметь один параметр.

28. Какой принцип объектно-ориентированного программирования проявляется в перегрузке методов?

Глава 2. Конструкторы

1. Дайте определение конструктора. Каково назначение конструктора?

Конструктор – это особый метод, предназначенный для инициализации объекта данного класса.

2. Перечислите отличия конструктора от метода.

Конструктор не имеет собственного имени – его имя совпадает с именем класса. Конструктор не возвращает результата (даже void).

3. Сколько конструкторов может быть в классе? Допускается ли перегрузка конструкторов?

4. Какие виды конструкторов создаются по умолчанию?

Конструктор по умолчанию, конструктор копирования.

5. Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным?

Да. Невозможность создавать объекты данного класса.

6. Приведите несколько случаев, когда конструктор вызывается неявно.

Копирование, конструирование внутренних/временных анонимных объектов, передача по значению, приведение типа.

7. Как инициализировать динамическую переменную?

При помощи new и конструктора данного класса. Для класса X: X *x = new X();

8. Как объявить константу в классе? Можно ли объявить дробную константу?

Константу в классе можно объявить как: 1) перечислимый тип enum ; 2) объявить и инициализировать статическое поле целочисленного типа: static const int i = 7; 3) константное поле класса: const double x ;

9. Каким образом разрешается инициализировать константные поля в классе?

С помощью списка инициализации конструктора.

10. В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора?

Поля получают значения в порядке объявления в классе. Вообще говоря, нет.

11. Какие конструкции C++ разрешается использовать в списке инициализации в качестве инициализирующих выражений?

Любое вычисляемое выражение, приводимое к типу инициализируемого поля.

12. Влияет ли наличие целочисленных констант-полей на размер класса?

Да, если только это не статические константы.

13. Объясните, что такое «инициализация нулем».

Если имя поля присутствует в списке инициализации, а инициализирующее значение для него отсутствует ( field() ), то выполняется «инициализация нулем»: для встроенных типов – обнуление значения поля, для невстроенных – вызов конструктора по умолчанию.

14. Что такое деструктор? Может ли деструктор иметь параметры? Допускается ли перегрузка деструкторов?

Специальный метод, автоматически вызываемый при уничтожении объекта своего класса.

15. Зачем нужны константные методы? Чем отличается определение константного метода от определения обычного?

Для работы с объектами-константами; чтобы предотвратить случайное изменение данных внутри метода и показать, что метод не меняет состояние класса. Ключевым словом const в заголовке метода: method() const

16. Может ли константный метод вызываться для объектов-переменных? А обычный метод — для объектов-констант?

Глава 3. Перегрузка операций

1. Какие операции нельзя перегружать? Как вы думаете, почему?

Соображения о том, почему нельзя перегружать эти операции приведены здесь.

2. Можно ли перегружать операции для встроенных типов данных?

3. Можно ли при перегрузке изменить приоритет операции?

4. Можно ли определить новую операцию?

Нет, нельзя определить свою собственную операцию. Хотя можно придать новый смысл одной из встроенных операций. Например, операцию инкремента для нового класса строк можно перегрузить как операцию перевода в верхний регистр и т. п.

5. Можно ли перегрузить операцию «запятая»?

6. Чем отличается функциональная форма вызова бинарной операции от инфиксной формы?

7. Перечислите особенности перегрузки операций методами класса. Чем отличается перегрузка внешним образом от перегрузки как метод класса?

У операций, перегруженных методами класса один параметр — текущий объект — определен по умолчанию. Поэтому, если операция перегружена методом класса, то количество явно определяемых параметров у неё на один меньше: у бинарных операций параметр один, а у унарных параметр отсутствует. У операций, перегруженных внешними функциями, все параметры заданы явно и их количество совпадает с типом операции.

8. Какой результат должны возвращать операции с присваиванием?

Операции с присваиванием должны возвращать ссылку на объект своего класса.

9. Объясните, что такое l-значение.

Выражение, которое может стоять слева от знака операции присваивания.

10. Как различаются перегруженная префиксная и постфиксная операции инкремента и декремента?

Префиксная форма должна возвращать ссылку, а постфиксная — значение. Постфиксная форма операции должна иметь фиктивный аргумент типа int.

Значение указателя на текущий объект. Используется для работы с текущим объектом.

12. Какие операции не рекомендуется перегружать как методы класса? Почему?

Бинарные операции, левым аргументом которых может быть объект, тип которого отличается от реализуемого типа (сложение, умножение и т. п.).

13. Объясните, почему при перегрузке операций нельзя задавать параметры по умолчанию?

Потому что запрещено изменять синтаксис операций.

14. Какие операции разрешается перегружать только как методы класса?

15. Перечислите все возможные способы задания явного преобразования типов.

Унаследованные от C:

16. Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?

Приведение типов с проверкой во время компиляции.

18. Какой вид конструктора фактически является конструктором преобразования типов?

20. Для чего нужны функции преобразования? Как объявить такую функцию в классе?

Функция преобразования выполняет преобразование типа класса в другой тип, т. е. выполняет операцию обратную той, что выполняет конструктор инициализации. Функция преобразования обязательно должна быть методом класса. В объявлении не должны задаваться ни тип возвращаемого значения, ни список параметров: operator type ();

21. Объясните назначение операции const_cast<>.

Оператор const_cast<> позволяет временно отменить константность.

22. Как запретить неявное преобразование типа, выполняемое конструктором инициализации?

23. Какие проблемы могут возникнуть при определении функций преобразования?

Может возникнуть неоднозначность при преобразовании типов.

Оно запрещает неявный вызов данного конструктора, препятствуя, таким образом, неявному преобразованию типов.

25. Как с помощью функции преобразования и конструктора инициализации определить «новые» операции для встроенных типов данных.

Для этого нужно определить класс-оболочку для встроенного типа и реализовать в этом классе преобразование типов и требуемые операции.

Глава 4. Массивы и классы

1. Можно ли объявить в классе поле-массив? Каким образом задается размер поля-массива?

Задать количество элементов массива можно либо явной константой, либо константным выражением со статическими и (или) перечислимыми константами, причем константы должны быть определены раньше массива.

2. Каким образом инициализируется поле-массив?

Инициализировать поле-массив можно в теле конструктора. Кроме этого, можно с помощью списка инициализации конструктора присвоить элементам массива нулевые значения.

3. Какой результат должна возвращать перегруженная операция индексирования? Почему?

Операция индексирования должна возвращать ссылку, так как выражение имя[индекс] может стоять как справа, так и слева от знака.

4. Почему операцию индексирования перегружают в двух вариантах?

Операцию индексирования обычно реализуют в константном и неконстантном варианте. Неконстантный метод работает, когда выражение имя[индекс] стоит слева от знака присваивания. Константный метод вызывается, когда имя[индекс] стоит справа от знака присваивания и текущий объект не изменяется.

5. Объясните проблемы, возникающие в случае аварийного завершения работы конструктора.

Конструктор не может вернуть код завершения, сигнализирующий об ошибке. Поэтому прекратить выполнение операции и сообщить об этом в вызывающую программу можно только с помощью механизма обработки исключений.

6. Как определяются статические поля класса?

Статические поля определяются вне класса (для статических констант целочисленного типа допускается инициализация внутри класса). При определении статические поля могут быть проинициализированы. По умолчанию статические поля класса инициализируются нулями.

7. Какие элементы класса можно объявлять статическими?

8. Можно ли объявить в классе статическую константу? А константный статический массив?

9. Какие статические поля можно инициализировать непосредственно в классе?

Статические константы целочисленного типа.

10. Как определяются статические поля? В какой момент работы программы выполняется инициализация статических полей?

Вне класса. типа). При этом слово static в операторе инициализации отсутствует. Статические поля создаются в единственном экземпляре при запуске программы, до создания любых объектов класса.

11. Сколько места в классе занимают статические поля?

Статические поля не занимают место в классе.

12. Чем отличается статический метод от обычного?

13. Какие методы класса не могут быть статическими?

Конструкторы, деструктор, константные методы, виртуальные методы.

14. Можно ли статический метод вызвать для объекта?

15. Какие варианты применения статических полей вы можете привести? А каким образом применяются статические методы?

Поля: когда данные (например, массив) нужны в единственном экземпляре, но без нарушения инкапсуляции. Методы: счётчик количества объектов класса; для запуска нужного конструктора.

Глава 5. Динамическая память в C++

1. Что является единицей памяти в C++? Какие требования к размеру единицы памяти прописаны в стандарте C++?

Байт должен быть такого размера, чтобы в нём был способен поместиться любой символ из базового набора символов.

3. Какие три вида памяти входят в модель памяти C++?

4. Какие формы операций new и delete вы знаете? В чем их различие?

5. Какие типы являются POD-типами? В чем различие работы механизма выделения и освобождения памяти с помощью операций new и delete при работе с POD- и nonPOD-объектами?

POD-типами (Plain Old Data) являются все типы, изначально определенные в С (встроенные типы, перечисления, указатели, массивы, структуры и объединения), а также классы, все поля которых являются POD-объектами и которые не являются наследниками, не имеют конструкторов и виртуальных функций.

Операции создания/уничтожения объектов POD-типов выполняются за один шаг: при создании выделяется требуемая под объект память, при уничтожении эта память освобождается. Для nonPOD-типов каждая из операций создания/уничтожения динамических объектов выполняется за два шага: при создании сначала выделяется память, а потом вызываются конструкторы (без аргументов или инициализации); при уничтожении — сначала вызывается деструктор, а потом возвращается память.

6. С помощью каких операций в C++ выделяют память?

С помощью new можно выделить память и инициализировать одиночные объекты, а с помощью new[] память выделяется под массивы, инициализировать которые при создании невозможно.

8. Почему для динамических классов-контейнеров деструктор надо писать явным образом?

Деструктор должен возвращать динамическую память, запрошенную в конструкторе.

9. С помощью каких операций в C++ осуществляется возврат динамической памяти?

10. Что такое «глубокое копирование» и когда в нём возникает необходимость? Какое копирование осуществляет стандартный конструктор копирования?

11. Чем отличается копирование от присваивания?

При присваивании необходимо возвратить системе память прежнего динамического объекта, при копировании в этом нет необходимости.

12. Объясните, почему в реализации операции присваивания требуется проверка присваивания самому себе.

Проверка самоприсваивания позволяет избежать лишней работы: не требуется создавать новый динамический массив и копировать в него элементы.

13. Сколько аргументов у операции присваивания?

С помощью () удобнее индексировать многомерные массивы (так как количество аргументов функции может быть произвольным).

15. Почему необходимо писать два определения операции индексирования? Чем они различаются?

Константный метод используется для работы с константными параметрами, когда имя[индекс] стоит справа от знака присваивания и текущий объект не изменяется. Неконстантный метод работает, когда выражение имя[индекс] стоит слева от знака присваивания. Один вариант константный, второй – нет.

Глава 6. Контейнеры

1. Дайте определение контейнера.

Контейнер – это тип данных, позволяющий хранить и извлекать объекты независимо от их содержимого. Экземпляр контейнера представляет собой набор объектов других типов. Например, контейнер vector хранит целые числа.

2. Какие виды встроенных контейнеров в C++ вы знаете?

3. Какие способы доступа к элементам контейнера вам известны?

Прямой (по индексу), последовательный, ассоциативный.

4. Чем отличается прямой доступ от ассоциативного?

В прямом доступе ключом является индекс элемента – целое число без знака.

5. Перечислите операции, которые обычно реализуются при последовательном доступе к элементам контейнера.

6. Дайте определение итератора.

Итератор — это объект, обеспечивающий последовательный доступ к элементам контейнера.

7. Можно ли реализовать последовательный доступ без итератора? В чем преимущества реализации последовательного доступа с помощью итератора?

Да. Например, с помощью методов класса-контейнера.

Использование итераторов позволяет отделить интерфейс доступа к элементам контейнера от интерфейса контейнера.

8. Что играет роль итератора для массивов C++?

9. Дайте определение вложенного класса.

Вложенным называется класс, объявленный внутри другого класса.

10. Можно ли класс-итератор реализовать как внешний класс? А как вложенный? В чем различия этих способов реализации?

Во втором случае объект «знает» о типе итератора заранее.

11. Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?

Объемлющий класс по умолчанию не имеет доступа к приватным элементам вложенного класса. Чтобы это было возможно, нужно использовать механизм дружественных классов.

Вложенный класс имеет неограниченный доступ к элементам объемлющего класса, так как сам вложенный класс является элементом объемлющего класса.

12. Ограничена ли глубина вложенности классов?

13. Можно ли определить вложенный класс внешним образом? Зачем это может понадобиться?

Это позволяет написать его определение в другом файле и транслировать его отдельно от объемлющего класса.

14. Каким образом вложенный класс может использовать методы объемлющего класса? А объемлющий — методы вложенного?

Как и для обычных невложенных классов необходимо объявить объект (или указатель), для которого вызвать нужный метод.

15. Что такое «запредельный» элемент, какую роль он играет в контейнерах?

Элемент, находящийся за последним элементом контейнера. Он играет роль предела при проверке завершения перебора элементов контейнера — цикл продолжается до тех пор, пока итератор не равен запредельному элементу.

16. Дайте определение стека, очереди и дека.

Стек, очередь и дек — разновидности последовательных контейнеров, отличающиеся способом вставки и удаления элементов.

Стек — контейнер, в котором вставка и удаление элементов выполняются только на одном конце контейнера.

Очередь — контейнер, в котором вставка выполняется на одном, а удаление — на другом конце контейнера.

Контейнер, в котором вставка и удаление выполняется на обоих концах контейнера называется деком.

Метод begin() возвращает итератор, установленный в начало последовательности элементов контейнера. Метод end() возвращает итератор, установленный на позицию за последним элементом последовательности (запредельный элемент).

18. Обязательно ли при реализации контейнеров программировать операцию присваивания? А конструктор копирования?

Чтобы избежать поверхностного копирования, когда несколько контейнеров делят между собой один и тот же ресурс.

19. Приведите минимальный интерфейс, который необходимо реализовать при разработке класса-стека.

20. Объясните, по каким причинам трудно написать универсальный контейнер, элементы которого могут иметь произвольный тип.

Трудно написать универсальный класс без использования механизма наследования или шаблонов. Для этого пришлось бы задействовать нетипизированные указатели, которые потенциально опасны.

Глава 7. Исключения

1. Объясните, зачем нужны исключения?

В первую очередь, в связи с необходимостью как-то реагировать на некорректное поведение программы во время работы конструкторов и перегруженных операций (вернуть информацию об ошибках в которых другим способом затруднительно).

2. Назовите ключевые слова C++, которые используются при обработке исключений.

3. Исключение — это:

4. Каким образом исключение генерируется?

5. Каковы функции контролируемого блока?

Проверка возникновения исключения.

Блок обработки исключения = секция-ловушка.

7. Какого типа может быть исключение?

Одного из встроенных ( exception и его наследников), либо определённого программистом.

8. Сколько параметров разрешается писать в заголовке секции-ловушки?

9. Какими способами разрешается передавать исключение в блок обработки?

Любым способом: по значению, по ссылке, по указателю.

10. Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки.

Поместить нужное количество блоков обработки, использовать блок обработки с указанием только типа исключения, создать структуру с кортежем параметров.

11. Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку?

Если бы преобразования были разрешены, то невозможно было бы перехватывать исключение конкретного типа.

12. В каких случаях преобразование типа все же выполняется?

Когда в качестве формального параметра в секции-ловушке используется базовый класс, внутрь секции может попасть объект производного класса, являющегося разновидностью базового (принцип подстановки).

13. Напишите конструкцию, которая позволяет перехватить любое исключение.

14. Могут ли контролируемые блоки быть вложенными?

15. Объясните термин «раскрутка стека».

Процесс уничтожения локальных объектов при выходе по исключению.

16. Зачем нужен «контролируемый блок-функция» и чем он отличается от обычного контролируемого блока?

Для перехвата исключений в списке инициализации конструктора. Контролируемый блок-функция является телом функции, а не находится внутри другой функции как обычный контролируемый блок.

17. Перечислите возможные способы выхода из блока обработки.

18. Каким образом исключение «передать дальше»?

Вызвать throw в секции-ловушке.

19. Сколько секций-ловушек должно быть задано в контролируемом блоке?

20. Что такое «спецификация исключений»?

Часть заголовка функции (метода, конструктора или деструктора), явно указывающая набор генерируемых ею исключений. Если в заголовке функции не указана спецификация исключений, считается, что функция может порождать любое исключение.

21. Что происходит, если функция нарушает спецификацию исключений?

22. Учитывается ли спецификация исключений при перегрузке функций?

Функции с различными спецификациями исключений не считаются разными при перегрузке.

23. Отличается ли функция с «пустой» спецификацией throw() от функции, у которой отсутствует спецификация исключений?

Если указанные функции отличаются только спецификациями исключений, то – нет. В общем же случае функции с throw() запрещено генерировать исключения, в то время как функция без спецификации может генерировать любое исключение.

24. Что такое «стандартные» исключения? Назовите два-три типа стандартных исключений.

25. Поясните «взаимоотношение» исключений и деструкторов.

26. Объясните, зачем может понадобиться подмена стандартных функций завершения.

Для подмены неперехваченных исключений исключением одного типа ( bad_exception или заданного программистом).

27. Может ли конструктор генерировать исключение? А деструктор?

28. Какие виды нестандартных исключений вы знаете?

Структурная обработка исключений Windows (SEH, Structured Exception Handling), обработка исключений конкретной библиотеки (MFC, VCL).

29. В чем отличие механизма структурной обработки исключений Windows от стандартного механизма?

Не выполняется вызов деструкторов.

30. Какие стандартные функции можно подменить, и каким образом это делается?

Подмена terminate() (для unexpected() выполняется аналогично):

set_terminate(f); // f функция с прототипом void f();

Глава 8. Наследование

1. Какие две роли исполняет наследование?

Наследование в ООП исполняет две роли: с одной стороны, предотвращает дублирование кода, с другой стороны, позволяет развивать работу в нужном направлении.

2. Какие виды наследования возможны в C++?

Простое и множественное, открытое и закрытое.

4. Чем открытое наследование отличается от закрытого и защищённого?

Открытое наследование не изменяет форму доступа в производном классе к элементам базового класса по сравнению с той, что объявлена в самом базовом классе. Защищённое наследование делает доступ к элементам базового класса защищённым, а приватное – приватным. Во всех случаях речь идёт о доступе к неприватным полям базового класса.

5. Может ли структура наследовать от класса? А класс от структуры?

6. Какой тип наследования от структуры реализуется по умолчанию? А от класса?

От структуры – открытое, от класса – закрытое. При этом общепринятой практикой является наследование только от классов.

7. В каких случаях в классе-наследнике недоступны элементы базового класса?

8. Какие функции не наследуются?

Дружественные. Не наследуются также операция присваивания, конструкторы и деструктор.

9. Сформулируйте правила написания конструкторов в производном классе.

10. Каков порядок вызова конструкторов? А деструкторов?

При создании объекта производного класса сначала вызывается конструктор базового класса, затем — производного. Деструкторы вызываются в порядке, обратном порядку вызова конструкторов. Таким образом, создание и уничтожение объектов выполняется по принципу LIFO: «последним создан — первым уничтожен».

11. Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?

12. Каким образом в конструкторе-наследнике вызвать конструктор базового класса?

В списке инициализации.

13. Что происходит, если имя метода-наследника совпадает с именем базового метода?

Метод производного класса скрывает одноимённый метод базового класса.

14. Каким образом в операции присваивания класса-наследника вызвать операцию присваивания базового класса?

С помощью квалификатора класса: Base::operator=(. );

15. Может ли вложенный класс наследовать от внешнего? А внешний от вложенного?

Ограничений в наследовании вложенных классов нет, но нужно следить за видимостью базового класса в точке наследования (см. с. 217).

16. Сформулируйте принцип подстановки.

При открытом наследовании объект производного класса является разновидностью объекта базового класса.

17. Когда выполняется понижающее приведение типов? А повышающее?

При преобразовании объекта базового класса в объект производного класса.

При преобразовании объекта производного класса в объект базового класса.

18. Объясните, что такое «срезка», или «расщепление».

Случай, когда в присваивании участвует два объекта из разных уровней одной иерархии. Одному из объектов присваивается только базовая часть (то, что он «знает») от другого объекта.

Использование using с именем метода/поля базового класса ( using :: ) позволяет открыть для клиента этот метод/поле при закрытом наследовании.

16. Дайте определение абстрактного класса.

Класс, содержащий хотя бы одну чистую виртуальную функцию.

17. Наследуются ли чистые виртуальные функции?

18. Можно ли объявить деструктор чисто виртуальным?

19. Чем отличается чистый виртуальный деструктор от чистой виртуальной функции?

20. Зачем требуется определение чистого виртуального деструктора?

Из-за того, что деструктор производного класса обязательно вызывает деструктор базового класса.

21. Можно ли сделать операцию присваивания виртуальной? А операцию индексирования? А чистой виртуальной?

22. Объясните, как можно реализовать «виртуальность» независимой функции.

Для этого надо в базовом классе объявить чистый виртуальный метод и определить его в производных классах. Во внешнюю функцию через параметр передавать ссылку на элемент базового класса, а внутри функции вызвать определенный ранее метод от имени базового класса.

23. Приведите классификацию целей наследования.

24. Объясните разницу между наследованием интерфейса и наследованием реализации.

Наследование реализации — это закрытое наследование (интерфейс базового класса не доступен пользователям напрямую). Наследование интерфейса — открытое наследование от абстрактного класса (интерфейса).

25. Как связаны виртуальные функции и принцип подстановки?

Вместе они реализуют полиморфизм времени выполнения.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *