http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&user=109.172.58.44&feedformat=atomВикиконспекты - Вклад участника [ru]2024-03-29T10:52:30ZВклад участникаMediaWiki 1.30.0http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%B0%D1%80%D1%8B%D0%B5_%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B_%D0%BD%D0%B0_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD_%D0%BF%D0%BE_C%2B%2B&diff=27180Старые вопросы на экзамен по C++2012-07-26T13:34:40Z<p>109.172.58.44: </p>
<hr />
<div>__TOC__<br />
<br />
== Классы, контейнеры ==<br />
# Что определяет класс? Чем обличается класс от объекта?<br />
#: Класс определяет тип объекта, а объект - это конкретный экземпляр класса.<br />
# Можно ли объявлять массив объектов? А массив классов?<br />
#: Смотря что считать массивом - в обычном смысле можно объявить массив объектов, с помощью метапрограммирования можно делать списки типов(классов)<br />
# Разрешается ли объявлять указатель на объект? А указатель на класс?<br />
#: Да. Нет.<br />
# Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?<br />
#: Допускается по значению и по ссылке. Возвращать также можно значение или ссылку.<br />
# Как называется использование объекта одного класса в качестве поля другого класса?<br />
#: Композиция<br />
# Является ли структура классом? Чем класс отличается от структуры?<br />
#: Является, у структуры все поля/методы по умолчанию public, у класса - private.<br />
# Объясните принцип инкапсуляции.<br />
#: Инкапсуляция - сокрытие методов и полей класса от пользователя, в целях сохранения внутренних инвариантов. При этом то, что помечено как public, называется интерфейсом класса.<br />
# Что такое композиция?<br />
#: Это создание нового класса путем объединения уже существующих в единую структуру.<br />
# Для чего используются ключевые слова public и private?<br />
#: см. инкапсуляция, также при public - наследовании все члены базового класса наследуются с теми же модификаторами, при private - все члены базового класса становятся private.<br />
# Можно ли использовать ключевые слова public и private в структуре?<br />
#: да<br />
# Существуют ли ограничения на использование public и private в классе? А в структуре?<br />
#: нет<br />
# Обязательно ли делать поля класса приватными?<br />
#: нет<br />
# Что такое метод? Как вызывается метод?<br />
#: Это функция, являющаяся членом класса. Если она не статическая, при ее вызове в нее неявно передается указатель на экземпляр, от которого она вызывается.<br />
# Может ли метод быть приватный?<br />
#: да<br />
# Как определить метод непосредственно внутри класса? А вне класса? Чем эти определения отличаются?<br />
#: Просто берем и определяем :) Вне класса - в описании класса пишем только объявление метода, вне класса реализацию.<br />
# Можно в методах присваивать параметрам значения по умолчанию?<br />
#: да<br />
# Что обозначается ключевым словом this?<br />
#: указатель на экземпляр класса, для которого вызван текущий метод. В статическом методе this недоступен.<br />
# Зачем нужны константные методы? Чем отличается определение константного метода от обычного?<br />
#: константный метод гарантирует, что мы не изменим состояние класса в процессе его работы. После сигнатуры надо написать const.<br />
# Может ли константный метод вызываться для объектов-переменных? А обычный метод — для объектов-констант?<br />
#: Да. Нет.<br />
# Объясните принцип полиморфизма.<br />
#: Полиморфизм - возможность работать с разными типами одинаковым образом. Статический - перегрузка функций, шаблоны. Динамический - виртуальные функции.<br />
# Сколько места в памяти занимает объект класса? Как это узнать?<br />
#: sizeof(a)<br />
# Каков размер «пустого» объекта?<br />
#: Здесь вроде понятно, что он должен быть ненулевой(у меня 1 байт, например), там добавляется фейковый член чтобы вообще можно было как-то хранить его в памяти.<br />
# Влияют ли методы на размер объекта?<br />
#: Если есть виртуальные методы, то размер увеличивается засчет указателся на таблицу виртуальных функций.<br />
# Одинаков ли размер класса и аналогичной структуры?<br />
#: да<br />
# Какие операции нельзя перегружать? Как вы думаете, почему?<br />
#: a ? b : c - в Страуструпе говорится что нет особых причин запрещать его перегрузку, так что непонятно.<br />
#: a::b - это вообще говоря не какая-то функция, а просто удобный способ избежать конфликта имен.<br />
#: a.b - непонятно, как тогда вызывать методы, и могут возникать конфликты ([http://pastebin.com/fJm050jm])<br />
#: sizeof(a), typeid(a) - видимо, что-то низкоуровневое, тоже надо поподробнее узнать<br />
#: a.*b - вообще без понятия что он делает <br />
# Можно ли перегружать операции для встроенных типов данных?<br />
#: Нет<br />
# Можно ли при перегрузке изменить приоритет операции?<br />
#: Нет<br />
# Можно ли определить новую операцию?<br />
#: Нет<br />
# Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса?<br />
#: Первый параметр оператора как метода класса - всегда неявно *this. Внешним образом нельзя обратиться к private полям класса. По этой причине, видимо, оператор>>/<< делается friend'ом - так как там он фактически перегружается внешним образом.<br />
# Какой результат должны возвращать операции с присваиванием?<br />
#: Ссылку на *this<br />
# Как различаются перегруженная префиксная и постфиксная операции инкремента и декремента?<br />
#: Префиксная(++a): T & operator++(); Постфиксная(a++): T operator++(int); - с фейковым параметром чтобы как-то отличать<br />
# Что означает выражение *this? В каких случаях оно используется?<br />
#: Разыменование указателя на текущий экземпляр. Например, чтобы вернуть объект :)<br />
# Какие операции не рекомендуется перегружать как методы класса? Почему?<br />
#: Нужно перегружать только те, которые меняют private члены(типа +=, -= и т.д.). А вот уже +, - и т.д. - могут воспользоваться уже перегруженными +=, -=. Не рекомендуется перегружать ||, &&, так как по умолчанию они оптимальны - т.е. если установлена истинность одного аргумента, второй даже не обрабатывается.<br />
# Какие операции разрешается перегружать только как методы класса?<br />
#: =, [], (), ->. Вопрос - почему?<br />
# Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?<br />
#: Дружественная для данного класса функция - которой предоставлен доступ к private и protected членам. Функция объявляется внутри класса, к которому надо предоставить доступ, определяется там, где нужно(уже без модификатора friend).<br />
# Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода.<br />
#: Конструктор - функция, которая вызывается при просто объявлении(конструктор по умолчанию) или инициализации объекта. Назначение - получать объект класса с какими-то начальными параметрами. Конструктор для данного можно вызвать только один раз.<br />
# Сколько конструкторов может быть в классе? Допускается ли перегрузка конструкторов? Какие виды конструкторов создаются по умолчанию?<br />
#: Сколько угодно. Допускается. По умолчанию создается пустой конструктор и конструктор копирования.<br />
# Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным?<br />
#: Может. Последствия - объект не может быть сконструирован этим конструктором извне.<br />
# Приведите несколько случаев, когда конструктор вызывается неявно.<br />
#: bigint a;(вызван пустой конструктор)<br />
#: bigint a = "123214";(вызван конструктор от string)<br />
#: bigint a = 10;(вызван конструтор от long long)<br />
# Как проинициализировать динамическую переменную?<br />
#: T* t = new T();<br />
# Как объявить константу в классе? Можно ли объявить дробную константу?<br />
#: Просто взять и объявить. Да.<br />
# Каким образом разрешается инициализировать константные поля в классе?<br />
#: Инициализировать ее можно только через список инициализации. Можно еще static const, ее нужно инициализировать сразу при объявлении<br />
# В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора?<br />
#: В порядке объявления. Нет.<br />
# Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений?<br />
#: Где бы это найти?<br />
# Какой вид конструктора фактически является конструктором преобразования типов?<br />
#: Видимо, любой неявный констркутор от одного аргумента.<br />
# Для чего нужны функции преобразования? Как объявить такую функцию в классе?<br />
#: Что это??<br />
# Как запретить неявное преобразование типа, выполняемое конструктором инициализации?<br />
#: Для этого есть ключевое слово explicit<br />
# Какие проблемы могут возникнуть при определении функций преобразования?<br />
#: ????<br />
# Для чего служит ключевое слово explicit?<br />
#: Чтобы не позволить вызвать конструктор от одного аргумента неявно.<br />
# Влияет ли наличие целочисленных констант-полей на размер класса?<br />
#: Они ничем не отличаются от обычных не-const полей.<br />
# Разрешается ли объявлять массив в качестве поля класса. Как присвоить элементам массива начальные значения?<br />
#: Разрешается, надо написать что-нибудь вроде int a[] = {1, 2, 3};<br />
# Сколько операндов имеет операция индексирования []? Какой вид результата должна возвращать эта операция?<br />
#: Операции индексирования нужен один аргумент - индекс. Возвращать T или T& в зависимости от того, можно ли менять объект.<br />
# Для чего нужны статические поля в классе? Как они определяются?<br />
#: Это какие-то параметры класса. Определяются с помощью ключевого слова static <br />
# Как объявить в классе и проинициализировать статический константный массив?<br />
#: struct S{static const int a[];}; const int S::a[] = {1, 2, 3};<br />
# Что такое выравнивание и от чего оно зависит? Влияет ли выравнивание на размер класса?<br />
#: Это способ расположения данных для ускорения доступа к ним. Да, размер может увеличиться.<br />
# Дайте определение контейнера.<br />
#: Это объект, который хранит "коллекцию" других объектов. Контейнер сам заботится о выделении памяти и других низкуровневых штуках, а нам предоставляет доступ к объектам, которые в нем находятся.<br />
# Какие виды встроенных контейнеров в С++ вы знаете?<br />
#: vector, deque, set, map, list<br />
# Какие виды доступа к элементам контейнера вам известны?<br />
#: Для чтения и(или) записи в одном/двух направлениях. Также есть произвольный доступ.<br />
# Чем отличается прямой доступ от ассоциативного?<br />
#: Прямой(direct access) - это вроеде через оператор[], а что такое ассоциативный?? <br />
# Перечислите операции, которые обычно реализуются для последовательного доступа к элементам контейнера.<br />
#: Видимо, инкремент итератора.<br />
# Дайте определение итератора.<br />
#: Это объект - обертка над указателем на какой-либо элемент контейнера. В нем должны быть реализованы хотя бы операции инкремента и разыменования.<br />
# Можно ли реализовать последовательный доступ без итератора? В чем преимущества реализации последовательного доступа с помощью итератора?<br />
# Что играет роль итератора для массивов С++?<br />
#: Хм, указатели, видимо.<br />
# Что такое деструктор? Может ли деструктор иметь параметры?<br />
#: Деструктор - то что будет вызвано после того, как объект выходит из своей области видимости для того, чтобы корректно освободить то, что выделяли в динамической памяти.<br />
# Почему для классов-контейнеров деструктор надо писать явным образом?<br />
#: Потому что там используется динамическая память.<br />
# Допускается ли перегрузка деструкторов?<br />
#: Нет<br />
# Что такое «глубокое копирование» и когда в нем возникает необходимость?<br />
#: Если мы копируем объект, в котором есть поле-указатель, надо скопировать объект, на который указывает тот указатель, а не просто указатель.<br />
# Какое копирование осуществляет стандартный конструктор копирования?<br />
#: Тупо копируются все поля.<br />
# Чем отличается копирование от присваивания?<br />
#: Копирование - инициализация объектом того же типа. Присваивание - замена уже существующего объекта.<br />
# Объясните, почему в операции присваивания требуется проверка присваивания самому себе?<br />
#: Потому что если мы работаем с ссылками, можно попортить объект при очистке памяти:<br />
#: struct A{int* a; A(){a = new int(10);} A & operator=(const A &b){delete a; a = new int(*b.a); return *this}<br />
#: В этом коде если присваиваем самому себе, неявно мы изменяем b после вызова delete a, и теряем значение *a.<br />
# Можно ли в качестве операции индексирования использовать операцию вызова функции ()? В чем ее преимущества перед операцией []?<br />
#: Можно впринципе. Плюс, видимо, в том что можно передавать сколько хочешь аргументов.<br />
# Почему необходимо писать два определения операции индексирования? Чем они отличаются?<br />
#: Первое определение возвращает ссылку на элемент, которых храним в контейнере, для того чтобы можно было его изменять.<br />
#: T & operator[](size_t index);<br />
#: Второе определение возвращает новый объект, для случая, когда мы работаем с контейнером, который нельзя менять.<br />
#: T operator[](size_t index);<br />
# Дайте определение вложенного класса.<br />
#: Класс внутри класса(and we need to go deeper :) )<br />
# Можно ли класс-итератор реализовать как внешний класс? А как вложенный? В чем отличия этих методов реализации?<br />
# Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?<br />
#: Я пока не очень понимаю, как иметь допуск не к static элементам. Надо получше про это узнать.<br />
# Ограничена ли глубина вложенности классов?<br />
#: ?? Где про это можно узнать?<br />
# Можно ли определить вложенный класс внешним образом? Зачем это может понадобиться?<br />
#: Да. Зачем - непонятно.<br />
# Каким образом вложенный класс может использовать методы объемлющего класса? А объемлющий — методы вложенного?<br />
#: Я пока не очень понимаю, как иметь допуск не к static элементам. Надо получше про это узнать.<br />
# Что такое «запредельный» элемент, какую роль он играет в контейнерах?<br />
#: В стандартных контейнерах это end(), используется для обозначения конца контейнера, возвращения в случае неудачного поиска, и т.д.<br />
# Объясните, по каким причинам трудно написать универсальный контейнер, элементы которого могут иметь произвольный тип.<br />
<br />
== Исключения ==<br />
# Назовите ключевые слова С++, которые используются для обработки исключений.<br />
#: try, catch, throw<br />
# Исключение — это:<br />
## событие;<br />
## ситуация;<br />
## объект;<br />
## ошибка в программе;<br />
## прерывание;<br />
# Каким образом исключение генерируется?<br />
# Каковы функции контролируемого блока?<br />
# Что обозначается ключевым словом catch?<br />
## контролируемый блок;<br />
## блок обработки исключения;<br />
## секция-ловушка;<br />
## генератор исключения;<br />
## обработчик прерывания;<br />
# Какого типа может быть исключение?<br />
#: вроде можно кинуть что угодно<br />
# Сколько параметров разрешается писать в заголовке секции-ловушки?<br />
# Какими способами разрешается передавать исключение в блок обработки?<br />
#: по значению и по указателю?<br />
# Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки.<br />
# Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку?<br />
# Напишите конструкцию, которая позволяет перехватить любое исключение.<br />
# Могут ли контролируемые блоки быть вложенными?<br />
# Зачем нужен «контролируемый блок-функция» и чем он отличается от обычного контролируемого блока?<br />
# Перечислите возможные способы выхода из блока обработки.<br />
# Каким образом исключение «передать дальше»?<br />
# Сколько секций-ловушек должно быть задано в контролируемом блоке?<br />
# Что такое «спецификация исключений»?<br />
# Что происходит, если функция нарушает спецификацию исключений?<br />
# Учитывается ли спецификация исключений при перегрузке функций?<br />
# Что такое «иерархия исключений»?<br />
# Существуют ли стандартные исключения? Назовите два-три типа стандартных исключений.<br />
#: runtime_error, bad_alloc<br />
# Поясните «взаимоотношение» исключений и деструкторов.<br />
# Объясните, зачем может понадобиться подмена стандартных функций завершения.<br />
# Какие виды нестандартных исключений вы знаете?<br />
# В чем отличие механизма структурной обработки исключений Windows от стандартного механизма?<br />
<br />
== Динамический полиморфизм ==<br />
# Какие две роли выполняет наследование?<br />
# Какие виды наследования возможны в С++?<br />
#: Простое и множественное?<br />
# Чем отличается модификатор доступа protected от модификаторов private и public?<br />
#: ну очевидно<br />
# Чем открытое наследование отличается от закрытого и защищенного?<br />
#: тоже очевидно -<br />
#:: какие все тут, блин, умные, всем всё очевидно.<br />
#::: а вот и не очевидно, читайте книги, читайте страуструпа <br />
# Какие функции не наследуются?<br />
#: Чисто виртуальные<br />
# Сформулируйте правила написания конструкторов в производном классе.<br />
#: ???<br />
# Каков порядок вызова конструкторов? А деструкторов?<br />
#: Конструкторы - сначала базовый, потом производный. Деструкторы наоборот.<br />
# Можно ли в производном классе объявлять новые поля? А методы?<br />
#: да. да<br />
# Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?<br />
#: конфликта не будет<br />
# Что происходит, если имя метода-наследника совпадает с именем базового метода?<br />
#: Метод перегружается, вроде как<br />
# Сформулируйте принцип подстановки.<br />
#: Если это принцип подстановки Лисков, то: свойство, верное для базового класса, должно выполняться и для наследника<br />
# Когда выполняется понижающее приведение типов?<br />
#: Это приведение ссылки на базовый класс к производному.<br />
# Объясните, что такое «срезка» или «расщепление».<br />
#: Видимо, это копирование полей производного объекта в базовый тип.<br />
# Объясните, зачем нужны виртуальные функции.<br />
#: Чтобы перегрузить их поведение при наследовании.<br />
# Что такое связывание?<br />
#: Связывание - сопоставление вызова функции с телом функции, которую вызовут.<br />
# Чем «раннее» связывание отличается от «позднего»?<br />
#: Раннее связывание - компилятор/компоновщик решают какая функция будет вызвана на этапе компиляции. Позднее - нужная функция выбирается на в рантайме.<br />
# Какие два вида полиморфизма реализованы в С++?<br />
#: Статический и динамический<br />
# Дайте определение полиморфного класса.<br />
#: Класс, в котором есть виртуальные методы.<br />
# Может ли виртуальная функция быть дружественной функцией класса?<br />
#: да<br />
# Наследуются ли виртуальные функции?<br />
#: наследуются по определению :)<br />
# Каковы особенности вызова виртуальных функций в конструкторах и деструкторах?<br />
#: Виртуальные функции, вызванные из конструкторов и деструкторов не будут виртуальными.<br />
# Можно ли сделать виртуальной перегруженную операцию, например, сложение?<br />
#: Можно<br />
# Может ли конструктор быть виртуальным? А деструктор?<br />
#: Нет. Да.<br />
# Как виртуальные функции влияют на размер класса?<br />
#: К размеру класса добавляется размер виртуальной таблицы функций.<br />
# Как объявляется «чистая» виртуальная функция?<br />
#: В конце сигнатуры пишут =0;<br />
# Дайте определение абстрактного класса.<br />
#: Абстрактный класс - класс, содержащий чисто абстрактные функции. У чисто абстрактного класса не может быть экзмепляра, но можно хранить на него указатель.<br />
# Наследуются ли чистые виртуальные функции?<br />
#: Да<br />
# Можно ли объявить деструктор чисто виртуальным?<br />
#: да<br />
# Чем отличается чистый виртуальный деструктор от чистой виртуальной функции? //чистый деструктор o_O<br />
# Зачем требуется определение чистого виртуального деструктора?<br />
#: чтобы можно было удалять объекты по указателю на базовый класс.<br />
# Наследуется ли определение чистой виртуальной функции?<br />
#: Нет. У чистой виртуальной функции нет смысла в определении.<br />
# Приведите классификацию целей наследования.<br />
#: Специализация базового класса. Реализация интерфейса базового класса(классов). Ограничение базового класса(адаптеры).<br />
# Объясните разницу наследования интерфейса от наследования реализации.<br />
#: Видимо, наследование интерфейса - public - наследование, реализации - protected?<br />
<br />
== Компиляция ==<br />
# Назовите причины, требующие разделения программ на части.<br />
#: во-первых, просто декомпозиция, для меньшей путаницы<br />
#: во-вторых, для того чтобы уменьшить время компиляции<br />
# Дайте определение термина «единица трансляции»?<br />
#: Данные, которые поступают компилятору для создания объектного файла, уже после того как прошли препроцессинг.<br />
# Чем отличается файл с исходным текстом от единицы трансляции?<br />
#: файл с исходным кодом не всегда является единицей трансляции.<br />
# Существуют ли в С++ конструкции, позволяющие идентифицировать отдельный модуль?<br />
#: Что такое модуль??<br />
# Какие способы сборки программы вы можете назвать?<br />
# Что такое «объектный модуль»? Программа, которая «собирает» объектные модули в программу, называется _____________ ?<br />
#: ???. Программа - линкер или компоновщик.<br />
# В чем заключается отличие аргумента «файл» от <файл> в директиве #include?<br />
#: <file> - ищет в папках, которые указаны в свойствах какой-то переменной Include(в вижаке задается свойствами проекта), "file" - в текущей директории.<br />
# Что такое ODR?<br />
#: One Definition Rule - принцип, по которому, переменная/класс/метод может быть опеределена только один раз в одной из единиц трансляции. При этом объявлять можно сколько угодно.<br />
# Объясните, что такое «страж» включения и зачем он нужен.<br />
#: Это или #pragma once или #ifndef H_NAME #define H_NAME //код хедера #endif. Нужен чтобы соблюдать ODR.<br />
# Является ли интерфейс класса его определением?<br />
# Сколько определений класса может быть в единице трансляции?<br />
#: одно<br />
# Сколько определений класса может быть в многофайловой программе?<br />
#: несколько<br />
# Чем отличаются стандартные заголовки <string>, <string.h> и <cstring>?<br />
#: <string> - строки C++, библиотеки STL. <string.h> - Строки C. <cstring> - то же, что <string.h>, но все обернуто в пространство имен std.<br />
# Объясните суть идиомы Pimpl.<br />
# Что такое делегирование и как его можно использовать для повышения степени инкапсуляции?<br />
# Каким образом глобальную переменную, определенную в одной единице трансляции, сделать доступной в другой единице трансляции? А константу?<br />
# Можно ли использовать слово extern при объявлении функций?<br />
# Как локализовать объявление функции в файле?<br />
# Чем отличается «внешнее» связывание от «внутреннего» связывания?<br />
# Что такое «спецификации компоновки»?<br />
# Какие объекты обладают внутренним связыванием по умолчанию?<br />
<br />
== Области видимости ==<br />
# Какие области видимости имен вы знаете?<br />
# Для чего используются пространства имен?<br />
#: Для какой-то логической группировки имен, и чтобы в область видимости не лезло то, что не нужно.<br />
# Чем отличаются именованные и неименованные пространства имен?<br />
#: К неименованному пространству имен нельзя будет обратиться откуда-то, кроме текущей единицы трансляции.<br />
# Могут ли пространства имен быть вложенными?<br />
#: Да<br />
# Для чего применяются алиасы пространства имен?<br />
#: Для удобства, чтобы каждый раз не писать длинный путь к функции или еще чему-нибудь.<br />
# Как сделать члены пространства имен доступными в нескольких (в пределе — во всех) файлах программного проекта?<br />
#: Вынести объявления всего что в них лежит в хедер.<br />
# Объясните разницу между статической и динамической инициализацией.<br />
#: Видимо, статическая - на этапе компиляции, динамичестая - в рантайме.<br />
# В чем состоит проблема инициализации глобальных статических переменных?<br />
#: Скорее всего в том, что непонятно, в каком порядке они инициализируются.<br />
# Какие элементы класса можно объявлять статическими?<br />
#: Поля и методы.<br />
# Можно ли объявить в классе статическую константу? А константный статический массив?<br />
#: Да. хм, надо попробовать.<br />
# А какие статические поля можно инициализировать непосредственно в классе?<br />
# Как определяются статические поля? В какой момент работы программы выполняется инициализация статических полей?<br />
# Сколько места в классе занимают статические поля ?<br />
#: нисколько<br />
# Чем отличается статический метод от обычного?<br />
#: Статический метод - метод класса, у него нет доступа к this.<br />
# Какие методы класса не могут быть статическими?<br />
#: Видимо, конструктор и деструктор?<br />
# Какие применения статических полей вы можете привести? А каким образом применяются статические методы?<br />
#: Тут можно привести нашу длинку, например, и то, как мы храним базу. Например, можно сделать класс со статическими методами Math(как в джаве), и реализовать там всякие математические операции, очень даже удобно.<br />
# Приведите структуру и принцип действия паттерна Singleton.<br />
<br />
== Шаблоны ==<br />
# Для чего предназначены шаблоны?<br />
# Какие виды шаблонов в С++ вы знаете?<br />
# Объясните термин «инстанцирование шаблона».<br />
# В чем разница между определением и объявлением шаблона?<br />
# Объясните назначение ключевого слова typename.<br />
# Какие виды параметров разрешается задавать в шаблоне класса? А в шаблоне функции?<br />
# Можно ли параметрам шаблона присваивать значения по умолчанию?<br />
# Может ли параметром шаблона быть другой шаблон? Каковы особенности объявления параметра-шаблона?<br />
# Что такое специализация шаблона? Объясните разницу между полной и частичной специализацией.<br />
# Разрешается ли специализировать шаблон функции?<br />
# Может ли класс-шаблон быть вложенным в другой класс-шаблон? А в обычный класс?<br />
# Можно ли объявить в классе шаблонный метод? А шаблонный конструктор?<br />
# Можно ли перегружать функцию-шаблон?<br />
# Какие параметры функции-шаблона выводятся автоматически?<br />
# Может ли шаблон класса быть наследником обычного класса? А обычный класс от шаблона?<br />
# Объясните, что такое класс свойств (класс трактовок).<br />
# Каким образом можно использовать возможность наследования обычного класса от шаблона?<br />
# Может ли шаблонный конструктор быть конструктором по умолчанию?<br />
# Для чего применяются директивы явного инстанцирования?<br />
# Объясните, в чем состоят проблемы, возникающие при разделении шаблонного класса на интерфейс и реализацию?<br />
# Что такое «модель явного инстанцирования» и как она работает?<br />
# Может ли шаблонный класс иметь «друзей»?<br />
# Какие проблемы возникают при объявлении дружественной функции для класса-шаблона?<br />
# Разрешается ли определять в классе-шаблоне статические поля? А статические методы?<br />
# Что такое «инициализация нулем»?<br />
<br />
== Память ==<br />
# Что является единицей памяти в С++? Какие требования к размеру единицы памяти прописаны в стандарте С++?<br />
#: Байт. Чтобы в нее вмещался любой символ, причем не требуется чтобы в байте было 8 бит.<br />
# В каких единицах выдает результат операция sizeof? Какие типы данных имеют размер 1?<br />
#: В байтах. char(signed/unsigned), bool<br />
# Какие три вида памяти входят в модель памяти С++?<br />
# Сколько видов динамической памяти обеспечивает С++?<br />
# Какие функции для работы с динамической памятью достались С++ по наследству от С? В какую библиотеку они включены?<br />
#: malloc, calloc, realloc, free. <cstdlib><br />
# Какие функции выделяют память, и с помощью каких функций память освобождается?<br />
#: malloc, calloc, realloc, new([]) выделяют, free, delete([]) освобождают(realloc, видимо, тоже может)<br />
# Какое важное отличие имеет функция calloc() от функции malloc()?<br />
#: calloc не только <br />
# Какие действия выполняют функции выделения памяти, если память не может быть выделена?<br />
#: Бросит исключение.<br />
# Зависит ли объем выделенной памяти от типа указателя? Влияет ли выравнивание на объем выделяемой динамической памяти?<br />
#: Сколько скажешь, столько и выделит. <br />
# Можно ли с помощью функции realloc() уменьшить объем выделенной памяти?<br />
#: Да<br />
# Что произойдет, если функции free() передать в качестве аргумента нулевой указатель?<br />
#: Ничего<br />
# В чем главное отличие объектно-ориентированного механизма new/delete от механизма malloc()/free()?<br />
#: new - бросает исклчение, вызывает конструкторы, по умолчанию. malloc - выделяет просто сырую память, возвращает null, если не получилось.<br />
# Сколько существует форм new/delete? В чем их отличие?<br />
#: new, delete, new[], delete[]. Первые два - для объектов, вторые - для массивов объектов.<br />
# Какие типы являются POD-типами? Чем отличается работа механизма new/delete с POD-объектами и nonPOD-объектами?<br />
#: Plain Old Data Structure in C++ is an aggregate class that contains only PODS as members, has no user-defined destructor, no user-defined copy assignment operator, and no nonstatic members of pointer-to-member type<br />
# Какие функции выполняет обработчик new?<br />
???<br />
# Можно ли реализовать собственный обработчик new и «прицепить» его к механизму new/delete?<br />
???<br />
# В чем главное отличие объединения от других видов классов С++?<br />
#: Размер объединения всегда равен размеру максимального его члена. Соответственно, в любой момент он корректно хранит только одно из своих полей.<br />
# Может ли объединение участвовать в иерархии наследования?<br />
# Разрешается ли определять для объединения конструкторы и деструктор? А виртуальные функции?<br />
#: Да. Нет. Нет.<br />
# В чем похожи и чем отличаются объединение и размещающий new?<br />
# Объясните, почему при использовании размещающего new нужно явным образом вызывать деструктор?<br />
# Зачем нужны интеллектуальные указатели?<br />
#: Чтобы не запутаться в new/delete. Умные указатели сами следят за объектами, которыми владеют.<br />
# Что такое «стратегия владения»? Сколько стратегий владения вы знаете?<br />
#: RAII. Garbage Collector тоже вроде ок? <br />
# Какой интеллектуальный указатель реализован в стандартной библиотеке STL, и какую стратегию владения он реализует?<br />
#: auto_ptr, RAII<br />
# Объясните, в чем преимущества и недостатки интеллектуальных указателей со счетчиком ссылок.<br />
#: преимущества - указатель владеет объектом. Безопасность в плане исключений. Недостатки - циклические ссылки и возможная путаница с обычными указателями.<br />
# Разрешается ли перегружать new и delete и какими способами?<br />
# Опишите схему функции, перегружающей глобальную функцию new.<br />
# Отличается ли реализация перегруженной функции new[]() для массивов от реализации «обычной» функции new()?<br />
# Как вы думаете, почему функции new/delete, перегружаемые для класса, являются статическими?<br />
# Зачем при перегрузке new/delete для класса нужно проверять размер запрашиваемой памяти?<br />
# Объясните, чем определяется «динамичность» контейнеров?<br />
# Что такое «стратегия распределения памяти», и какие стратегии выделения памяти вы знаете?<br />
# Рассмотрите следующую стратегию распределения памяти: память выделяется для нескольких элементов блоками фиксированной длины, но блоки связываются в список. Для какого вида контейнера можно использовать такую стратегию?<br />
# Какие операции можно перегрузить для доступа к элементам двумерного массива?<br />
# В чем заключаются сложности использования операции индексирования [] для доступа к элементам двумерного массива?<br />
# Каковы способы реализации операций с контейнерами?<br />
# Какую конструкцию можно назвать «обобщенный алгоритм»?<br />
# Каким образом объявить указатель на метод?<br />
# Объясните разницу между указателем на функцию и указателем на метод.<br />
# Каким образом получить адрес метода?<br />
# Можно ли указателю на функцию присваивать адрес метода?<br />
# Какие операции определены в С++ для косвенного вызова метода через указатель?<br />
# Что такое «функтор»? Приведите пример функционального класса.<br />
#: Это класс с перегруженным оператором(). Например, можно сделать абстрактный интерфейс унарной функции, у которой будет виртуальный оператор().<br />
# Какими способами функтор вызывается?<br />
# Можно ли использовать наследование при разработке функторов?<br />
# Разрешается ли операцию вызова функции () определять как виртуальный метод? А как статический?<br />
# В чем преимущества функторов перед указателями на функции?<br />
# Объясните, зачем нужны адаптеры функторов? Какие виды адаптеров вы знаете?<br />
# Как используются классы свойств при разработке функторов?<br />
# Объясните, что такое «композиция» и приведите примеры?<br />
# Объясните, чем отличается множественное наследование от простого?<br />
# Приведите структуру и принцип действия паттерна Adapter.<br />
# Сформулируйте основную проблему множественного наследования.<br />
#: Читай ромбическое наследование(diamond problem)<br />
# Выполняется ли принцип подстановки при открытом множественном наследовании?<br />
# Что такое виртуальное наследование? Каковы его преимущества и недостатки по сравнению с обычным наследованием?<br />
# Может ли виртуальное наследование быть одиночным?<br />
# Влияет ли виртуальное наследование на размер класса?<br />
# Объясните, каким образом с помощью виртуального наследования можно вообще запретить наследование.<br />
# Какие средства С++ составляют RTTI?<br />
#: dynamic cast и typeid<br />
# Объясните разницу между повышающим, понижающим и перекрестным приведением.<br />
# Какими свойствами должен обладать класс, чтобы с ним работал механизм RTTI?<br />
# В чем приведение указателей отличается от приведения ссылок?<br />
# Какие исключения связаны с механизмом RTTI?<br />
<br />
== Ввод-вывод ==<br />
# Что такое «поток» — дайте определение.<br />
#: Поток - абстрактный объект, который представляет собой определенное устройство для выполнения операций ввода/вывода. Обычно представляет собой источник/получатель символов неопределенной длины. Чаще всего ассоциируются с физическими источниками/получателями символов, такие как файлы, клавиатура, консоль, etc<br />
# Как классифицируются потоки, реализованые в библиотеках ввода/вывода С++?<br />
#: (???) Вопрос под вопросом.<br />
# Что такое буферизация и зачем она нужна?<br />
#: Буферизация нужна для более эффективной передачи данных: поток с буферизацией собирает символы в streambuf, который хранит символы в массиве, пока не будет вынужден из-за переполнения записать их по назначению. Небуферизованный ввод-вывод сразу осуществляет передачу символов, не заботясь о том, чтобы сделать передачу эффективной.<br />
# Какие библиотеки ввода/вывода реализованы в С++ и чем они отличаются?<br />
#: Основная библиотека для ввода/вывода в С++ - iostream. Ее организация: <br />
#* <ios>, <istream>, <ostream>, <streambuf> and <iosfwd> aren't usually included directly in most C++ programs. They describe the base classes of the hierarchy and are automatically included by other header files of the library that contain derived classes.<br />
#*<iostream> declares the objects used to communicate through the standard input and output (including cin and cout).<br />
#*<fstream> defines the file stream classes (like the template basic_ifstream or the class ofstream) as well as the internal buffer objects used with these (basic_filebuf). These classes are used to manipulate files using streams.<br />
#*<sstream>: The classes defined in this file are used to manipulate string objects as if they were streams.<br />
#*<iomanip> declares some standard manipulators with parameters to be used with extraction and insertion operators to modify internal flags and formatting options.<br />
# Перечислите стандартные потоки и объясните их назначение.<br />
#: Стандартный поток ввода: std::cin, вывода - std::cout, error output stream - std::cerr<br />
# Зачем нужен процесс форматирования и когда он выполняется?<br />
#: (???) Зачем - понятно, но когда?<br />
# Что такое «форматная строка», и в каких функциях она используется?<br />
<br />
# Объясните назначение элементов спецификатора формата.<br />
# Сколько спецификаторов формата может быть в форматной строке?<br />
# Какой из элементов спецификатора формата не является умалчиваемым?<br />
# Перечислите несколько известных вам обозначений типов в спецификаторе формата, и укажите их назначение.<br />
# Сколько модификаторов типа вы знаете, и какую роль модификатор типа играет в спецификаторе формата?<br />
# С помощью какого флага можно выровнять выводимое значение влево? А каким образом вывести ведущие нули?<br />
# Какое действие оказывают на выводимую строку ширина, точнойть и флаги в спецификаторе формата?<br />
# Для чего в спецификаторе формата может использоваться символ звездочка («*»)? Чем отличается действие этого символа при воде и при выводе?<br />
# Каковы особенности ввода строк?<br />
# Каким образом ограничить набор вводимых символов при вводе?<br />
# Что является главной проблемой при использовании форматного ввода/вывода из библиотеки <cstdio>?<br />
# Объясните, для чего нужны строковые потоки. Почему строковые потоки —всегда форматируемые?<br />
# С помощью каких функций выполняется работа со строковыми потоками?<br />
# Можно ли использовать тип string (и каким образом) со строковыми потоками?<br />
# Объясните, в чем заключается различие между текстовым и двоичным файлом.<br />
# Объясните, что означает «открыть» файл и «закрыть» файл?<br />
# Каким образом внешний файл связывается с потоком?<br />
# Можно ли один и тот же поток связать с разными файлами? А один и тот же файл с разными потоками?<br />
# Перечислите режимы открытия файла. Чем отличается режим “r” от режима “a”?<br />
# Какую роль в режиме открытия играет знак плюс («+»)?<br />
# В каких случаях необходимо следить за ситуацией «конец файла»? Каким способом это делается?<br />
# Можно ли текстовый файл открыть как двоичный? А двоичный — как текстовый?<br />
# Какие функции ввода/вывода используются для обмена с текстовыми файлами?<br />
# Перечислите функции ввода/вывода для работы с двоичными файлами.<br />
# Какие функции реализованы в библиотеке <cstdio> для обеспечения прямого доступа к записям двоичного файла? Можно ли их использовать для работы с текстовыми файлами?<br />
# Объясните назначение функции fseek().<br />
# Чем отличается функция ftell() от функции fgetpos()?<br />
# Объясните, что означает «перенаправление» потока? Какие потоки можно перенаправлять и куда?<br />
# Каким образом перенаправление ввода можно использовать для ввода строк с пробелами?<br />
# В чем преимущества объектно-ориентированной библитеки по сравнению с процедурной?<br />
# В каких состояних может находиться поток? Каким образом отслживается состояние «конец потока»?<br />
# Какие объектно-ориентированные потоки связаны со стандартными потоками?<br />
# Чем отличаются объектно-ориентированные строковые потоки от процедурных строковых потоков?<br />
# Каким образом строковые потоки можно использовать для ограничения ширины поля ввода? А можно ли с той же целью использовать строковые потоки <cstdio>?<br />
# Сравните средства форматирования объектно-ориентированной и процедурной библиотеки.<br />
# Каким образом ввести строку типа string с пробелами?<br />
# Каково назначение флагов форматированя? Какие средства реализованы в библиотеке для работы с флагами форматирования?<br />
# Что такое «манипулятор»? В чем преимущества манипуляторов перед флагами форматирования?<br />
# Как связываются файлы с потоками в объектно-ориентированной библиотеке?<br />
# Можно ли файлы, записанные функциями библиотеки <cstdio>, прочитать объектно-ориентированными средствами? А наоборот?<br />
# Перечислите режимы открытия объектно-ориентированных файловых потоков. каким образом комбинируются режимы открытия файлоавых потоков?<br />
# Обязательно ли закрывать файл, связанный с объектно-ориентированным файловым потоком? А открывать?<br />
# Каким образом открыть файловый поток для чтения и записи одновременно?<br />
# Как открыть файловый поток для дозаписи?<br />
# Можно ли вывести значение переменной в двоичном виде и как это сделать?<br />
# Разрешается ли наследовать от классов библиотеки ввода/вывода?<br />
# Каким образом можно еренаправить объектно-ориентированный поток?<br />
# Как используется буфер потока для копирования потока?<br />
# Какими операциями выполняется форматированный ввод/вывод в файловые потоки? А неформатированный?<br />
# Реализованы ли в объектно-ориентированной библиотеке средства прямого доступа к файловым потокам? Сравните их с аналогичными средствами библиотеки <cstdio>.<br />
# С какими объектно-ориентированными потоками разрешается, и с какими не разрешается использовать средства прямого доступа?<br />
# Покажите, каким образом можно выполнить перегрузку операций ввода/вывода для нового типа данных.<br />
# Как выполняется обработка ошибок ввода/вывода в объектно-ориентированной библиотеке?<br />
# Какое стандартное исключение генерируется при ошибках ввода/вывода? Обязательно ли оно генерируется?<br />
# Чем стандартные широкие потоки отличаются от узких?<br />
# Что такое — «локаль», и каково ее назначение?<br />
# Как установить русский шрифт при выводе в консольное окно?<br />
# Чем отличается ли ввод/вывод широких файловых потоков от узких?<br />
<br />
== STL ==<br />
# Перечислите все последовательные контейнеры стандартной библиотеки. Чем они отличаются друг от друга?<br />
# Перечислите адаптеры последовательных контейнеров и дайте их подробную характеристику.<br />
# Почему для адаптеров-очередей нельзя использовать вектор в качестве базового?<br />
# Чем простая очередь queue отличается от приоритетной очереди priority_queue?<br />
# Каким требованиям должны удовлетворять элементы контейнера?<br />
# Могут ли быть указатели элементами контейнера? А итераторы?<br />
# Почему нельзя использовать в качестве элементов контейнера стандартный интеллектуальный указатель auto_ptr?<br />
# Зачем в контейнере list реализованы собственные методы сортировки поиска и слияния? Можно ли пользоваться соответствующими стандартными алгоритмами при обработке списка?<br />
# Перечислите типовые виды конструкторов, с помощью которых можно создавать последовательный контейнер.<br />
# Можно ли инициализировать контейнер элементами встроенного массива? А элементами другого контейнера? Какими способами это можно сделать?<br />
# Почему конструктор инициализации, параметрами которого являются итераторы, сделан шаблонным во всех контейнерах?<br />
# Какие методы реализованы в контейнере-векторе для доступа к элементам?<br />
# Отличается ли функция at() доступа по индексу от перегруженной операции индексирования и чем?<br />
# Перечислите методы контейнера deque, относящиеся к определению размеров контейнера.<br />
# Чем метод size() отличается от метода capacity()? А в чем отличие этих методов от метода max_size()?<br />
# Перечислите методы контейнера list, предназначенные для вставки удаления и замены элементов. Отличаются ли эти методы от соответствующих методов вектора и дека?<br />
# Каким образом выполняются операции сравнения контейнеров?<br />
# Разрешается ли изменять элемент ассоциативного контейнера, доступный в данный момент по итератору?<br />
# Какие контейнеры называются ассоциативными и почему?<br />
# Чем контейнер map отличается от контейнера multimap?<br />
# Объясните, почему в ассоциативных контейнерах нельзя изменять элемент, доступный в данный момент по итератору.<br />
# По каким причинам в контейнере-множестве не реализованы типовые операции объединения, пересечения, разности и другие?<br />
# Как используется структура-пара в ассоциативных контейнерах?<br />
# Объясните, что такое «критерий сортировки», и каким требованиям он должен удовлетворять? Какой критерий сортировки принят по умолчанию?<br />
# Какими преимуществами обладает функция make_pair() по сравнению с конструктором pair()?<br />
# Почему в контейнерах-отображениях операция индексирования перегружена, а в контейнерах-множествах — нет?<br />
# Какие гарантии безопасности обеспечивают контейнеры стандартной библиотеки?<br />
# Что такое «транзакционная гарантия безопасности» и чем она отличается от базовой?<br />
# На какие 4 класса по надежности можно разделить все операции с контейнерами?<br />
# Что такое «распределитель памяти» и зачем он нужен?<br />
# Чем отличается битовый вектор bitset от битового вектора vector<bool>?<br />
# Дайте определение итератора.<br />
# Что такое «начальный» итератор и «конечный» итератор? Какие методы, связанные с итераторами, обязательно включает каждый контейнер?<br />
# Чем константный итератор отличается от неконстантного?<br />
# Объясните, что такое «недействительный» итератор. В каких случаях итераторы становятся недействительными?<br />
# Какие категории итераторов вы знаете? Какие операции обязательно реализуются для всех категорий итераторов?<br />
# К какому виду итераторов можно отнести встроенный указатель и почему?<br />
# Какие вспомогательные функции для итераторов вы знаете? В каких случаях оправдано их применение?<br />
# Какие адаптеры итераторов реализованы в библиотеке?<br />
# Объясните, почему итераторы реализованы как вложенные классы в контейнерах.<br />
# Чем отличаются итераторы вставки от обычных итераторов?<br />
# Каким образом используются потоковые итераторы?<br />
# Какие стандартные функторы реализованы в библиотеке STL? Каково их основное назначение?<br />
# Для чего нужны адаптеры функторов bind1st() и bind2nd()?<br />
# Как применяются адаптеры-отрицатели?<br />
# Почему алгоритмы remove() не удаляют элементы из контейнеров? Как реально удалить элементы из контейнера?<br />
# Чем отличается стабильная сортировка от обычной?<br />
# Какую функцию выполняет алгоритмы unique()?<br />
# Могут ли стандартные алгоритмы работать со строками?<br />
# Нужно ли сортировать ассоциативные контейнеры?<br />
# Можно ли алгоритмы для работы с множествами применять для последовательных контейнеров? При каких условиях?<br />
# Какие алгоритмы предназначены для заполнения контейнера значениями? С какими контейнерами они могут работать?<br />
# Каким образом заполнить с помощью алгоритма generate() последовательный контейнер, не имеющий ни одного элемента?<br />
# Перечислите алгоритмы, предназначенные для операций с каждым элементом контейнера.<br />
# Можно ли с помощью алгоритма for_each() изменить элементы контейнера?<br />
<br />
<br />
''PS Обращаю Ваше внимание на то, что это - базовый список. В него не включены вопросы, которые обсуждаются на лекциях, поэтому не стоит считать, что они не будут заданы Вам на экзамене.''<br />
<br />
''С уважением, Ковалев Антон''<br />
<br />
Это вопросы из книги:<br />
Лаптев В.В. С++. Объектно-ориентированное программирование. - Спб.: Питер, 2008. - 464 с. <br />
Первоначальный список вопросов был опубликован на сайте РСДН (27.04.06): http://rsdn.ru/?Forum/?fuid=18459</div>109.172.58.44