Старые вопросы на экзамен по C++
Версия от 11:41, 26 января 2012; 192.168.0.2 (обсуждение) (→а вот и не очевидно, читайте книги, читайте страуструпа)
Содержание
Классы, контейнеры
- Что определяет класс? Чем обличается класс от объекта?
- Класс определяет тип объекта, а объект - это конкретный экземпляр класса.
- Можно ли объявлять массив объектов? А массив классов?
- Смотря что считать массивом - в обычном смысле можно объявить массив объектов, с помощью метапрограммирования можно делать списки типов(классов)
- Разрешается ли объявлять указатель на объект? А указатель на класс?
- Да. Нет.
- Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?
- Допускается по значению и по ссылке. Возвращать также можно значение или ссылку.
- Как называется использование объекта одного класса в качестве поля другого класса?
- Композиция
- Является ли структура классом? Чем класс отличается от структуры?
- Является, у структуры все поля/методы по умолчанию public, у класса - private.
- Объясните принцип инкапсуляции.
- Инкапсуляция - сокрытие методов и полей класса от пользователя, в целях сохранения внутренних инвариантов. При этом то, что помечено как public, называется интерфейсом класса.
- Что такое композиция?
- Это создание нового класса путем объединения уже существующих в единую структуру.
- Для чего используются ключевые слова public и private?
- см. инкапсуляция, также при public - наследовании все члены базового класса наследуются с теми же модификаторами, при private - все члены базового класса становятся private.
- Можно ли использовать ключевые слова public и private в структуре?
- да
- Существуют ли ограничения на использование public и private в классе? А в структуре?
- нет
- Обязательно ли делать поля класса приватными?
- нет
- Что такое метод? Как вызывается метод?
- Это функция, являющаяся членом класса. Если она не статическая, при ее вызове в нее неявно передается указатель на экземпляр, от которого она вызывается.
- Может ли метод быть приватный?
- да
- Как определить метод непосредственно внутри класса? А вне класса? Чем эти определения отличаются?
- Просто берем и определяем :) Вне класса - в описании класса пишем только объявление метода, вне класса реализацию.
- Можно в методах присваивать параметрам значения по умолчанию?
- да
- Что обозначается ключевым словом this?
- указатель на экземпляр класса, для которого вызван текущий метод. В статическом методе this недоступен.
- Зачем нужны константные методы? Чем отличается определение константного метода от обычного?
- константный метод гарантирует, что мы не изменим состояние класса в процессе его работы. После сигнатуры надо написать const.
- Может ли константный метод вызываться для объектов-переменных? А обычный метод — для объектов-констант?
- Да. Нет.
- Объясните принцип полиморфизма.
- Полиморфизм - возможность работать с разными типами одинаковым образом. Статический - перегрузка функций, шаблоны. Динамический - виртуальные функции.
- Сколько места в памяти занимает объект класса? Как это узнать?
- sizeof(a)
- Каков размер «пустого» объекта?
- Здесь вроде понятно, что он должен быть ненулевой(у меня 1 байт, например), там добавляется фейковый член чтобы вообще можно было как-то хранить его в памяти.
- Влияют ли методы на размер объекта?
- Если есть виртуальные методы, то размер увеличивается засчет указателся на таблицу виртуальных функций.
- Одинаков ли размер класса и аналогичной структуры?
- да
- Какие операции нельзя перегружать? Как вы думаете, почему?
- a ? b : c - в Страуструпе говорится что нет особых причин запрещать его перегрузку, так что непонятно.
- a::b - это вообще говоря не какая-то функция, а просто удобный способ избежать конфликта имен.
- a.b - непонятно, как тогда вызывать методы, и могут возникать конфликты ([1])
- sizeof(a), typeid(a) - видимо, что-то низкоуровневое, тоже надо поподробнее узнать
- a.*b - вообще без понятия что он делает
- Можно ли перегружать операции для встроенных типов данных?
- Нет
- Можно ли при перегрузке изменить приоритет операции?
- Нет
- Можно ли определить новую операцию?
- Нет
- Перечислите особенности перегрузки операций как методов класса. Чем отличается перегрузка внешним образом от перегрузки как метода класса?
- Первый параметр оператора как метода класса - всегда неявно *this. Внешним образом нельзя обратиться к private полям класса. По этой причине, видимо, оператор>>/<< делается friend'ом - так как там он фактически перегружается внешним образом.
- Какой результат должны возвращать операции с присваиванием?
- Ссылку на *this
- Как различаются перегруженная префиксная и постфиксная операции инкремента и декремента?
- Префиксная(++a): T & operator++(); Постфиксная(a++): T operator++(int); - с фейковым параметром чтобы как-то отличать
- Что означает выражение *this? В каких случаях оно используется?
- Разыменование указателя на текущий экземпляр. Например, чтобы вернуть объект :)
- Какие операции не рекомендуется перегружать как методы класса? Почему?
- Нужно перегружать только те, которые меняют private члены(типа +=, -= и т.д.). А вот уже +, - и т.д. - могут воспользоваться уже перегруженными +=, -=. Не рекомендуется перегружать ||, &&, так как по умолчанию они оптимальны - т.е. если установлена истинность одного аргумента, второй даже не обрабатывается.
- Какие операции разрешается перегружать только как методы класса?
- =, [], (), ->. Вопрос - почему?
- Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?
- Дружественная для данного класса функция - которой предоставлен доступ к private и protected членам. Функция объявляется внутри класса, к которому надо предоставить доступ, определяется там, где нужно(уже без модификатора friend).
- Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода.
- Конструктор - функция, которая вызывается при просто объявлении(конструктор по умолчанию) или инициализации объекта. Назначение - получать объект класса с какими-то начальными параметрами. Конструктор для данного можно вызвать только один раз.
- Сколько конструкторов может быть в классе? Допускается ли перегрузка конструкторов? Какие виды конструкторов создаются по умолчанию?
- Сколько угодно. Допускается. По умолчанию создается пустой конструктор и конструктор копирования.
- Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным?
- Может. Последствия - объект не может быть сконструирован этим конструктором извне.
- Приведите несколько случаев, когда конструктор вызывается неявно.
- bigint a;(вызван пустой конструктор)
- bigint a = "123214";(вызван конструктор от string)
- bigint a = 10;(вызван конструтор от long long)
- Как проинициализировать динамическую переменную?
- T* t = new T();
- Как объявить константу в классе? Можно ли объявить дробную константу?
- Просто взять и объявить. Да.
- Каким образом разрешается инициализировать константные поля в классе?
- Инициализировать ее можно только через список инициализации. Можно еще static const, ее нужно инициализировать сразу при объявлении
- В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора?
- В порядке объявления. Нет.
- Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений?
- Где бы это найти?
- Какой вид конструктора фактически является конструктором преобразования типов?
- Видимо, любой неявный констркутор от одного аргумента.
- Для чего нужны функции преобразования? Как объявить такую функцию в классе?
- Что это??
- Как запретить неявное преобразование типа, выполняемое конструктором инициализации?
- Для этого есть ключевое слово explicit
- Какие проблемы могут возникнуть при определении функций преобразования?
- ????
- Для чего служит ключевое слово explicit?
- Чтобы не позволить вызвать конструктор от одного аргумента неявно.
- Влияет ли наличие целочисленных констант-полей на размер класса?
- Они ничем не отличаются от обычных не-const полей.
- Разрешается ли объявлять массив в качестве поля класса. Как присвоить элементам массива начальные значения?
- Разрешается, надо написать что-нибудь вроде int a[] = {1, 2, 3};
- Сколько операндов имеет операция индексирования []? Какой вид результата должна возвращать эта операция?
- Операции индексирования нужен один аргумент - индекс. Возвращать T или T& в зависимости от того, можно ли менять объект.
- Для чего нужны статические поля в классе? Как они определяются?
- Это какие-то параметры класса. Определяются с помощью ключевого слова static
- Как объявить в классе и проинициализировать статический константный массив?
- struct S{static const int a[];}; const int S::a[] = {1, 2, 3};
- Что такое выравнивание и от чего оно зависит? Влияет ли выравнивание на размер класса?
- Это способ расположения данных для ускорения доступа к ним. Да, размер может увеличиться.
- Дайте определение контейнера.
- Это объект, который хранит "коллекцию" других объектов. Контейнер сам заботится о выделении памяти и других низкуровневых штуках, а нам предоставляет доступ к объектам, которые в нем находятся.
- Какие виды встроенных контейнеров в С++ вы знаете?
- vector, deque, set, map, list
- Какие виды доступа к элементам контейнера вам известны?
- Для чтения и(или) записи в одном/двух направлениях. Также есть произвольный доступ.
- Чем отличается прямой доступ от ассоциативного?
- Прямой(direct access) - это вроеде через оператор[], а что такое ассоциативный??
- Перечислите операции, которые обычно реализуются для последовательного доступа к элементам контейнера.
- Видимо, инкремент итератора.
- Дайте определение итератора.
- Это объект - обертка над указателем на какой-либо элемент контейнера. В нем должны быть реализованы хотя бы операции инкремента и разыменования.
- Можно ли реализовать последовательный доступ без итератора? В чем преимущества реализации последовательного доступа с помощью итератора?
- Что играет роль итератора для массивов С++?
- Хм, указатели, видимо.
- Что такое деструктор? Может ли деструктор иметь параметры?
- Деструктор - то что будет вызвано после того, как объект выходит из своей области видимости для того, чтобы корректно освободить то, что выделяли в динамической памяти.
- Почему для классов-контейнеров деструктор надо писать явным образом?
- Потому что там используется динамическая память.
- Допускается ли перегрузка деструкторов?
- Нет
- Что такое «глубокое копирование» и когда в нем возникает необходимость?
- Если мы копируем объект, в котором есть поле-указатель, надо скопировать объект, на который указывает тот указатель, а не просто указатель.
- Какое копирование осуществляет стандартный конструктор копирования?
- Тупо копируются все поля.
- Чем отличается копирование от присваивания?
- Копирование - инициализация объектом того же типа. Присваивание - замена уже существующего объекта.
- Объясните, почему в операции присваивания требуется проверка присваивания самому себе?
- Потому что если мы работаем с ссылками, можно попортить объект при очистке памяти:
- struct A{int* a; A(){a = new int(10);} A & operator=(const A &b){delete a; a = new int(*b.a); return *this}
- В этом коде если присваиваем самому себе, неявно мы изменяем b после вызова delete a, и теряем значение *a.
- Можно ли в качестве операции индексирования использовать операцию вызова функции ()? В чем ее преимущества перед операцией []?
- Можно впринципе. Плюс, видимо, в том что можно передавать сколько хочешь аргументов.
- Почему необходимо писать два определения операции индексирования? Чем они отличаются?
- Первое определение возвращает ссылку на элемент, которых храним в контейнере, для того чтобы можно было его изменять.
- T & operator[](size_t index);
- Второе определение возвращает новый объект, для случая, когда мы работаем с контейнером, который нельзя менять.
- T operator[](size_t index);
- Дайте определение вложенного класса.
- Класс внутри класса(and we need to go deeper :) )
- Можно ли класс-итератор реализовать как внешний класс? А как вложенный? В чем отличия этих методов реализации?
- Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего?
- Я пока не очень понимаю, как иметь допуск не к static элементам. Надо получше про это узнать.
- Ограничена ли глубина вложенности классов?
- ?? Где про это можно узнать?
- Можно ли определить вложенный класс внешним образом? Зачем это может понадобиться?
- Да. Зачем - непонятно.
- Каким образом вложенный класс может использовать методы объемлющего класса? А объемлющий — методы вложенного?
- Я пока не очень понимаю, как иметь допуск не к static элементам. Надо получше про это узнать.
- Что такое «запредельный» элемент, какую роль он играет в контейнерах?
- В стандартных контейнерах это end(), используется для обозначения конца контейнера, возвращения в случае неудачного поиска, и т.д.
- Объясните, по каким причинам трудно написать универсальный контейнер, элементы которого могут иметь произвольный тип.
Исключения
- Назовите ключевые слова С++, которые используются для обработки исключений.
- try, catch, throw
- Исключение — это:
- событие;
- ситуация;
- объект;
- ошибка в программе;
- прерывание;
- Каким образом исключение генерируется?
- Каковы функции контролируемого блока?
- Что обозначается ключевым словом catch?
- контролируемый блок;
- блок обработки исключения;
- секция-ловушка;
- генератор исключения;
- обработчик прерывания;
- Какого типа может быть исключение?
- вроде можно кинуть что угодно
- Сколько параметров разрешается писать в заголовке секции-ловушки?
- Какими способами разрешается передавать исключение в блок обработки?
- по значению и по указателю?
- Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки.
- Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку?
- Напишите конструкцию, которая позволяет перехватить любое исключение.
- Могут ли контролируемые блоки быть вложенными?
- Зачем нужен «контролируемый блок-функция» и чем он отличается от обычного контролируемого блока?
- Перечислите возможные способы выхода из блока обработки.
- Каким образом исключение «передать дальше»?
- Сколько секций-ловушек должно быть задано в контролируемом блоке?
- Что такое «спецификация исключений»?
- Что происходит, если функция нарушает спецификацию исключений?
- Учитывается ли спецификация исключений при перегрузке функций?
- Что такое «иерархия исключений»?
- Существуют ли стандартные исключения? Назовите два-три типа стандартных исключений.
- runtime_error, bad_alloc
- Поясните «взаимоотношение» исключений и деструкторов.
- Объясните, зачем может понадобиться подмена стандартных функций завершения.
- Какие виды нестандартных исключений вы знаете?
- В чем отличие механизма структурной обработки исключений Windows от стандартного механизма?
Динамический полиморфизм
- Какие две роли выполняет наследование?
- Какие виды наследования возможны в С++?
- Простое и множественное?
- Чем отличается модификатор доступа protected от модификаторов private и public?
- ну очевидно
- Чем открытое наследование отличается от закрытого и защищенного?
- тоже очевидно -
- какие все тут, блин, умные, всем всё очевидно.
- тоже очевидно -
а вот и не очевидно, читайте книги, читайте страуструпа
- Какие функции не наследуются?
- Чисто виртуальные
- Сформулируйте правила написания конструкторов в производном классе.
- ???
- Каков порядок вызова конструкторов? А деструкторов?
- Конструкторы - сначала базовый, потом производный. Деструкторы наоборот.
- Можно ли в производном классе объявлять новые поля? А методы?
- да. да
- Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?
- конфликта не будет
- Что происходит, если имя метода-наследника совпадает с именем базового метода?
- Метод перегружается, вроде как
- Сформулируйте принцип подстановки.
- Если это принцип подстановки Лисков, то: свойство, верное для базового класса, должно выполняться и для наследника
- Когда выполняется понижающее приведение типов?
- Это приведение ссылки на базовый класс к производному.
- Объясните, что такое «срезка» или «расщепление».
- Видимо, это копирование полей производного объекта в базовый тип.
- Объясните, зачем нужны виртуальные функции.
- Чтобы перегрузить их поведение при наследовании.
- Что такое связывание?
- Связывание - сопоставление вызова функции с телом функции, которую вызовут.
- Чем «раннее» связывание отличается от «позднего»?
- Раннее связывание - компилятор/компоновщик решают какая функция будет вызвана на этапе компиляции. Позднее - нужная функция выбирается на в рантайме.
- Какие два вида полиморфизма реализованы в С++?
- Статический и динамический
- Дайте определение полиморфного класса.
- Класс, в котором есть виртуальные методы.
- Может ли виртуальная функция быть дружественной функцией класса?
- да
- Наследуются ли виртуальные функции?
- наследуются по определению :)
- Каковы особенности вызова виртуальных функций в конструкторах и деструкторах?
- Виртуальные функции, вызванные из конструкторов и деструкторов не будут виртуальными.
- Можно ли сделать виртуальной перегруженную операцию, например, сложение?
- Можно
- Может ли конструктор быть виртуальным? А деструктор?
- Нет. Да.
- Как виртуальные функции влияют на размер класса?
- К размеру класса добавляется размер виртуальной таблицы функций.
- Как объявляется «чистая» виртуальная функция?
- В конце сигнатуры пишут =0;
- Дайте определение абстрактного класса.
- Абстрактный класс - класс, содержащий чисто абстрактные функции. У чисто абстрактного класса не может быть экзмепляра, но можно хранить на него указатель.
- Наследуются ли чистые виртуальные функции?
- Да
- Можно ли объявить деструктор чисто виртуальным?
- да
- Чем отличается чистый виртуальный деструктор от чистой виртуальной функции? //чистый деструктор o_O
- Зачем требуется определение чистого виртуального деструктора?
- чтобы можно было удалять объекты по указателю на базовый класс.
- Наследуется ли определение чистой виртуальной функции?
- Нет. У чистой виртуальной функции нет смысла в определении.
- Приведите классификацию целей наследования.
- Специализация базового класса. Реализация интерфейса базового класса(классов). Ограничение базового класса(адаптеры).
- Объясните разницу наследования интерфейса от наследования реализации.
- Видимо, наследование интерфейса - public - наследование, реализации - protected?
Компиляция
- Назовите причины, требующие разделения программ на части.
- во-первых, просто декомпозиция, для меньшей путаницы
- во-вторых, для того чтобы уменьшить время компиляции
- Дайте определение термина «единица трансляции»?
- Данные, которые поступают компилятору для создания объектного файла, уже после того как прошли препроцессинг.
- Чем отличается файл с исходным текстом от единицы трансляции?
- файл с исходным кодом не всегда является единицей трансляции.
- Существуют ли в С++ конструкции, позволяющие идентифицировать отдельный модуль?
- Что такое модуль??
- Какие способы сборки программы вы можете назвать?
- Что такое «объектный модуль»? Программа, которая «собирает» объектные модули в программу, называется _____________ ?
- ???. Программа - линкер или компоновщик.
- В чем заключается отличие аргумента «файл» от <файл> в директиве #include?
- <file> - ищет в папках, которые указаны в свойствах какой-то переменной Include(в вижаке задается свойствами проекта), "file" - в текущей директории.
- Что такое ODR?
- One Definition Rule - принцип, по которому, переменная/класс/метод может быть опеределена только один раз в одной из единиц трансляции. При этом объявлять можно сколько угодно.
- Объясните, что такое «страж» включения и зачем он нужен.
- Это или #pragma once или #ifndef H_NAME #define H_NAME //код хедера #endif. Нужен чтобы соблюдать ODR.
- Является ли интерфейс класса его определением?
- Сколько определений класса может быть в единице трансляции?
- одно
- Сколько определений класса может быть в многофайловой программе?
- несколько
- Чем отличаются стандартные заголовки <string>, <string.h> и <cstring>?
- <string> - строки C++, библиотеки STL. <string.h> - Строки C. <cstring> - то же, что <string.h>, но все обернуто в пространство имен std.
- Объясните суть идиомы Pimpl.
- Что такое делегирование и как его можно использовать для повышения степени инкапсуляции?
- Каким образом глобальную переменную, определенную в одной единице трансляции, сделать доступной в другой единице трансляции? А константу?
- Можно ли использовать слово extern при объявлении функций?
- Как локализовать объявление функции в файле?
- Чем отличается «внешнее» связывание от «внутреннего» связывания?
- Что такое «спецификации компоновки»?
- Какие объекты обладают внутренним связыванием по умолчанию?
Области видимости
- Какие области видимости имен вы знаете?
- Для чего используются пространства имен?
- Для какой-то логической группировки имен, и чтобы в область видимости не лезло то, что не нужно.
- Чем отличаются именованные и неименованные пространства имен?
- К неименованному пространству имен нельзя будет обратиться откуда-то, кроме текущей единицы трансляции.
- Могут ли пространства имен быть вложенными?
- Да
- Для чего применяются алиасы пространства имен?
- Для удобства, чтобы каждый раз не писать длинный путь к функции или еще чему-нибудь.
- Как сделать члены пространства имен доступными в нескольких (в пределе — во всех) файлах программного проекта?
- Вынести объявления всего что в них лежит в хедер.
- Объясните разницу между статической и динамической инициализацией.
- Видимо, статическая - на этапе компиляции, динамичестая - в рантайме.
- В чем состоит проблема инициализации глобальных статических переменных?
- Скорее всего в том, что непонятно, в каком порядке они инициализируются.
- Какие элементы класса можно объявлять статическими?
- Поля и методы.
- Можно ли объявить в классе статическую константу? А константный статический массив?
- Да. хм, надо попробовать.
- А какие статические поля можно инициализировать непосредственно в классе?
- Как определяются статические поля? В какой момент работы программы выполняется инициализация статических полей?
- Сколько места в классе занимают статические поля ?
- нисколько
- Чем отличается статический метод от обычного?
- Статический метод - метод класса, у него нет доступа к this.
- Какие методы класса не могут быть статическими?
- Видимо, конструктор и деструктор?
- Какие применения статических полей вы можете привести? А каким образом применяются статические методы?
- Тут можно привести нашу длинку, например, и то, как мы храним базу. Например, можно сделать класс со статическими методами Math(как в джаве), и реализовать там всякие математические операции, очень даже удобно.
- Приведите структуру и принцип действия паттерна Singleton.
Шаблоны
- Для чего предназначены шаблоны?
- Какие виды шаблонов в С++ вы знаете?
- Объясните термин «инстанцирование шаблона».
- В чем разница между определением и объявлением шаблона?
- Объясните назначение ключевого слова typename.
- Какие виды параметров разрешается задавать в шаблоне класса? А в шаблоне функции?
- Можно ли параметрам шаблона присваивать значения по умолчанию?
- Может ли параметром шаблона быть другой шаблон? Каковы особенности объявления параметра-шаблона?
- Что такое специализация шаблона? Объясните разницу между полной и частичной специализацией.
- Разрешается ли специализировать шаблон функции?
- Может ли класс-шаблон быть вложенным в другой класс-шаблон? А в обычный класс?
- Можно ли объявить в классе шаблонный метод? А шаблонный конструктор?
- Можно ли перегружать функцию-шаблон?
- Какие параметры функции-шаблона выводятся автоматически?
- Может ли шаблон класса быть наследником обычного класса? А обычный класс от шаблона?
- Объясните, что такое класс свойств (класс трактовок).
- Каким образом можно использовать возможность наследования обычного класса от шаблона?
- Может ли шаблонный конструктор быть конструктором по умолчанию?
- Для чего применяются директивы явного инстанцирования?
- Объясните, в чем состоят проблемы, возникающие при разделении шаблонного класса на интерфейс и реализацию?
- Что такое «модель явного инстанцирования» и как она работает?
- Может ли шаблонный класс иметь «друзей»?
- Какие проблемы возникают при объявлении дружественной функции для класса-шаблона?
- Разрешается ли определять в классе-шаблоне статические поля? А статические методы?
- Что такое «инициализация нулем»?
Память
- Что является единицей памяти в С++? Какие требования к размеру единицы памяти прописаны в стандарте С++?
- Байт. Чтобы в нее вмещался любой символ, причем не требуется чтобы в байте было 8 бит.
- В каких единицах выдает результат операция sizeof? Какие типы данных имеют размер 1?
- В байтах. char(signed/unsigned), bool
- Какие три вида памяти входят в модель памяти С++?
- Сколько видов динамической памяти обеспечивает С++?
- Какие функции для работы с динамической памятью достались С++ по наследству от С? В какую библиотеку они включены?
- malloc, calloc, realloc, free. <cstdlib>
- Какие функции выделяют память, и с помощью каких функций память освобождается?
- malloc, calloc, realloc, new([]) выделяют, free, delete([]) освобождают(realloc, видимо, тоже может)
- Какое важное отличие имеет функция calloc() от функции malloc()?
- calloc не только
- Какие действия выполняют функции выделения памяти, если память не может быть выделена?
- Бросит исключение.
- Зависит ли объем выделенной памяти от типа указателя? Влияет ли выравнивание на объем выделяемой динамической памяти?
- Сколько скажешь, столько и выделит.
- Можно ли с помощью функции realloc() уменьшить объем выделенной памяти?
- Да
- Что произойдет, если функции free() передать в качестве аргумента нулевой указатель?
- Ничего
- В чем главное отличие объектно-ориентированного механизма new/delete от механизма malloc()/free()?
- new - бросает исклчение, вызывает конструкторы, по умолчанию. malloc - выделяет просто сырую память, возвращает null, если не получилось.
- Сколько существует форм new/delete? В чем их отличие?
- new, delete, new[], delete[]. Первые два - для объектов, вторые - для массивов объектов.
- Какие типы являются POD-типами? Чем отличается работа механизма new/delete с POD-объектами и nonPOD-объектами?
- 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
- Какие функции выполняет обработчик new?
???
- Можно ли реализовать собственный обработчик new и «прицепить» его к механизму new/delete?
???
- В чем главное отличие объединения от других видов классов С++?
- Размер объединения всегда равен размеру максимального его члена. Соответственно, в любой момент он корректно хранит только одно из своих полей.
- Может ли объединение участвовать в иерархии наследования?
- Разрешается ли определять для объединения конструкторы и деструктор? А виртуальные функции?
- Да. Нет. Нет.
- В чем похожи и чем отличаются объединение и размещающий new?
- Объясните, почему при использовании размещающего new нужно явным образом вызывать деструктор?
- Зачем нужны интеллектуальные указатели?
- Чтобы не запутаться в new/delete. Умные указатели сами следят за объектами, которыми владеют.
- Что такое «стратегия владения»? Сколько стратегий владения вы знаете?
- RAII. Garbage Collector тоже вроде ок?
- Какой интеллектуальный указатель реализован в стандартной библиотеке STL, и какую стратегию владения он реализует?
- auto_ptr, RAII
- Объясните, в чем преимущества и недостатки интеллектуальных указателей со счетчиком ссылок.
- преимущества - указатель владеет объектом. Безопасность в плане исключений. Недостатки - циклические ссылки и возможная путаница с обычными указателями.
- Разрешается ли перегружать new и delete и какими способами?
- Опишите схему функции, перегружающей глобальную функцию new.
- Отличается ли реализация перегруженной функции new[]() для массивов от реализации «обычной» функции new()?
- Как вы думаете, почему функции new/delete, перегружаемые для класса, являются статическими?
- Зачем при перегрузке new/delete для класса нужно проверять размер запрашиваемой памяти?
- Объясните, чем определяется «динамичность» контейнеров?
- Что такое «стратегия распределения памяти», и какие стратегии выделения памяти вы знаете?
- Рассмотрите следующую стратегию распределения памяти: память выделяется для нескольких элементов блоками фиксированной длины, но блоки связываются в список. Для какого вида контейнера можно использовать такую стратегию?
- Какие операции можно перегрузить для доступа к элементам двумерного массива?
- В чем заключаются сложности использования операции индексирования [] для доступа к элементам двумерного массива?
- Каковы способы реализации операций с контейнерами?
- Какую конструкцию можно назвать «обобщенный алгоритм»?
- Каким образом объявить указатель на метод?
- Объясните разницу между указателем на функцию и указателем на метод.
- Каким образом получить адрес метода?
- Можно ли указателю на функцию присваивать адрес метода?
- Какие операции определены в С++ для косвенного вызова метода через указатель?
- Что такое «функтор»? Приведите пример функционального класса.
- Это класс с перегруженным оператором(). Например, можно сделать абстрактный интерфейс унарной функции, у которой будет виртуальный оператор().
- Какими способами функтор вызывается?
- Можно ли использовать наследование при разработке функторов?
- Разрешается ли операцию вызова функции () определять как виртуальный метод? А как статический?
- В чем преимущества функторов перед указателями на функции?
- Объясните, зачем нужны адаптеры функторов? Какие виды адаптеров вы знаете?
- Как используются классы свойств при разработке функторов?
- Объясните, что такое «композиция» и приведите примеры?
- Объясните, чем отличается множественное наследование от простого?
- Приведите структуру и принцип действия паттерна Adapter.
- Сформулируйте основную проблему множественного наследования.
- Читай ромбическое наследование(diamond problem)
- Выполняется ли принцип подстановки при открытом множественном наследовании?
- Что такое виртуальное наследование? Каковы его преимущества и недостатки по сравнению с обычным наследованием?
- Может ли виртуальное наследование быть одиночным?
- Влияет ли виртуальное наследование на размер класса?
- Объясните, каким образом с помощью виртуального наследования можно вообще запретить наследование.
- Какие средства С++ составляют RTTI?
- dynamic cast и typeid
- Объясните разницу между повышающим, понижающим и перекрестным приведением.
- Какими свойствами должен обладать класс, чтобы с ним работал механизм RTTI?
- В чем приведение указателей отличается от приведения ссылок?
- Какие исключения связаны с механизмом RTTI?
Ввод-вывод
- Что такое «поток» — дайте определение.
- Поток - абстрактный объект, который представляет собой определенное устройство для выполнения операций ввода/вывода. Обычно представляет собой источник/получатель символов неопределенной длины. Чаще всего ассоциируются с физическими источниками/получателями символов, такие как файлы, клавиатура, консоль, etc
- Как классифицируются потоки, реализованые в библиотеках ввода/вывода С++?
- (???) Вопрос под вопросом.
- Что такое буферизация и зачем она нужна?
- Буферизация нужна для более эффективной передачи данных: поток с буферизацией собирает символы в streambuf, который хранит символы в массиве, пока не будет вынужден из-за переполнения записать их по назначению. Небуферизованный ввод-вывод сразу осуществляет передачу символов, не заботясь о том, чтобы сделать передачу эффективной.
- Какие библиотеки ввода/вывода реализованы в С++ и чем они отличаются?
- Основная библиотека для ввода/вывода в С++ - iostream. Ее организация:
- <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.
- <iostream> declares the objects used to communicate through the standard input and output (including cin and cout).
- <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.
- <sstream>: The classes defined in this file are used to manipulate string objects as if they were streams.
- <iomanip> declares some standard manipulators with parameters to be used with extraction and insertion operators to modify internal flags and formatting options.
- Перечислите стандартные потоки и объясните их назначение.
- Стандартный поток ввода: std::cin, вывода - std::cout, error output stream - std::cerr
- Зачем нужен процесс форматирования и когда он выполняется?
- (???) Зачем - понятно, но когда?
- Что такое «форматная строка», и в каких функциях она используется?
- Объясните назначение элементов спецификатора формата.
- Сколько спецификаторов формата может быть в форматной строке?
- Какой из элементов спецификатора формата не является умалчиваемым?
- Перечислите несколько известных вам обозначений типов в спецификаторе формата, и укажите их назначение.
- Сколько модификаторов типа вы знаете, и какую роль модификатор типа играет в спецификаторе формата?
- С помощью какого флага можно выровнять выводимое значение влево? А каким образом вывести ведущие нули?
- Какое действие оказывают на выводимую строку ширина, точнойть и флаги в спецификаторе формата?
- Для чего в спецификаторе формата может использоваться символ звездочка («*»)? Чем отличается действие этого символа при воде и при выводе?
- Каковы особенности ввода строк?
- Каким образом ограничить набор вводимых символов при вводе?
- Что является главной проблемой при использовании форматного ввода/вывода из библиотеки <cstdio>?
- Объясните, для чего нужны строковые потоки. Почему строковые потоки —всегда форматируемые?
- С помощью каких функций выполняется работа со строковыми потоками?
- Можно ли использовать тип string (и каким образом) со строковыми потоками?
- Объясните, в чем заключается различие между текстовым и двоичным файлом.
- Объясните, что означает «открыть» файл и «закрыть» файл?
- Каким образом внешний файл связывается с потоком?
- Можно ли один и тот же поток связать с разными файлами? А один и тот же файл с разными потоками?
- Перечислите режимы открытия файла. Чем отличается режим “r” от режима “a”?
- Какую роль в режиме открытия играет знак плюс («+»)?
- В каких случаях необходимо следить за ситуацией «конец файла»? Каким способом это делается?
- Можно ли текстовый файл открыть как двоичный? А двоичный — как текстовый?
- Какие функции ввода/вывода используются для обмена с текстовыми файлами?
- Перечислите функции ввода/вывода для работы с двоичными файлами.
- Какие функции реализованы в библиотеке <cstdio> для обеспечения прямого доступа к записям двоичного файла? Можно ли их использовать для работы с текстовыми файлами?
- Объясните назначение функции fseek().
- Чем отличается функция ftell() от функции fgetpos()?
- Объясните, что означает «перенаправление» потока? Какие потоки можно перенаправлять и куда?
- Каким образом перенаправление ввода можно использовать для ввода строк с пробелами?
- В чем преимущества объектно-ориентированной библитеки по сравнению с процедурной?
- В каких состояних может находиться поток? Каким образом отслживается состояние «конец потока»?
- Какие объектно-ориентированные потоки связаны со стандартными потоками?
- Чем отличаются объектно-ориентированные строковые потоки от процедурных строковых потоков?
- Каким образом строковые потоки можно использовать для ограничения ширины поля ввода? А можно ли с той же целью использовать строковые потоки <cstdio>?
- Сравните средства форматирования объектно-ориентированной и процедурной библиотеки.
- Каким образом ввести строку типа string с пробелами?
- Каково назначение флагов форматированя? Какие средства реализованы в библиотеке для работы с флагами форматирования?
- Что такое «манипулятор»? В чем преимущества манипуляторов перед флагами форматирования?
- Как связываются файлы с потоками в объектно-ориентированной библиотеке?
- Можно ли файлы, записанные функциями библиотеки <cstdio>, прочитать объектно-ориентированными средствами? А наоборот?
- Перечислите режимы открытия объектно-ориентированных файловых потоков. каким образом комбинируются режимы открытия файлоавых потоков?
- Обязательно ли закрывать файл, связанный с объектно-ориентированным файловым потоком? А открывать?
- Каким образом открыть файловый поток для чтения и записи одновременно?
- Как открыть файловый поток для дозаписи?
- Можно ли вывести значение переменной в двоичном виде и как это сделать?
- Разрешается ли наследовать от классов библиотеки ввода/вывода?
- Каким образом можно еренаправить объектно-ориентированный поток?
- Как используется буфер потока для копирования потока?
- Какими операциями выполняется форматированный ввод/вывод в файловые потоки? А неформатированный?
- Реализованы ли в объектно-ориентированной библиотеке средства прямого доступа к файловым потокам? Сравните их с аналогичными средствами библиотеки <cstdio>.
- С какими объектно-ориентированными потоками разрешается, и с какими не разрешается использовать средства прямого доступа?
- Покажите, каким образом можно выполнить перегрузку операций ввода/вывода для нового типа данных.
- Как выполняется обработка ошибок ввода/вывода в объектно-ориентированной библиотеке?
- Какое стандартное исключение генерируется при ошибках ввода/вывода? Обязательно ли оно генерируется?
- Чем стандартные широкие потоки отличаются от узких?
- Что такое — «локаль», и каково ее назначение?
- Как установить русский шрифт при выводе в консольное окно?
- Чем отличается ли ввод/вывод широких файловых потоков от узких?
STL
- Перечислите все последовательные контейнеры стандартной библиотеки. Чем они отличаются друг от друга?
- Перечислите адаптеры последовательных контейнеров и дайте их подробную характеристику.
- Почему для адаптеров-очередей нельзя использовать вектор в качестве базового?
- Чем простая очередь queue отличается от приоритетной очереди priority_queue?
- Каким требованиям должны удовлетворять элементы контейнера?
- Могут ли быть указатели элементами контейнера? А итераторы?
- Почему нельзя использовать в качестве элементов контейнера стандартный интеллектуальный указатель auto_ptr?
- Зачем в контейнере list реализованы собственные методы сортировки поиска и слияния? Можно ли пользоваться соответствующими стандартными алгоритмами при обработке списка?
- Перечислите типовые виды конструкторов, с помощью которых можно создавать последовательный контейнер.
- Можно ли инициализировать контейнер элементами встроенного массива? А элементами другого контейнера? Какими способами это можно сделать?
- Почему конструктор инициализации, параметрами которого являются итераторы, сделан шаблонным во всех контейнерах?
- Какие методы реализованы в контейнере-векторе для доступа к элементам?
- Отличается ли функция at() доступа по индексу от перегруженной операции индексирования и чем?
- Перечислите методы контейнера deque, относящиеся к определению размеров контейнера.
- Чем метод size() отличается от метода capacity()? А в чем отличие этих методов от метода max_size()?
- Перечислите методы контейнера list, предназначенные для вставки удаления и замены элементов. Отличаются ли эти методы от соответствующих методов вектора и дека?
- Каким образом выполняются операции сравнения контейнеров?
- Разрешается ли изменять элемент ассоциативного контейнера, доступный в данный момент по итератору?
- Какие контейнеры называются ассоциативными и почему?
- Чем контейнер map отличается от контейнера multimap?
- Объясните, почему в ассоциативных контейнерах нельзя изменять элемент, доступный в данный момент по итератору.
- По каким причинам в контейнере-множестве не реализованы типовые операции объединения, пересечения, разности и другие?
- Как используется структура-пара в ассоциативных контейнерах?
- Объясните, что такое «критерий сортировки», и каким требованиям он должен удовлетворять? Какой критерий сортировки принят по умолчанию?
- Какими преимуществами обладает функция make_pair() по сравнению с конструктором pair()?
- Почему в контейнерах-отображениях операция индексирования перегружена, а в контейнерах-множествах — нет?
- Какие гарантии безопасности обеспечивают контейнеры стандартной библиотеки?
- Что такое «транзакционная гарантия безопасности» и чем она отличается от базовой?
- На какие 4 класса по надежности можно разделить все операции с контейнерами?
- Что такое «распределитель памяти» и зачем он нужен?
- Чем отличается битовый вектор bitset от битового вектора vector<bool>?
- Дайте определение итератора.
- Что такое «начальный» итератор и «конечный» итератор? Какие методы, связанные с итераторами, обязательно включает каждый контейнер?
- Чем константный итератор отличается от неконстантного?
- Объясните, что такое «недействительный» итератор. В каких случаях итераторы становятся недействительными?
- Какие категории итераторов вы знаете? Какие операции обязательно реализуются для всех категорий итераторов?
- К какому виду итераторов можно отнести встроенный указатель и почему?
- Какие вспомогательные функции для итераторов вы знаете? В каких случаях оправдано их применение?
- Какие адаптеры итераторов реализованы в библиотеке?
- Объясните, почему итераторы реализованы как вложенные классы в контейнерах.
- Чем отличаются итераторы вставки от обычных итераторов?
- Каким образом используются потоковые итераторы?
- Какие стандартные функторы реализованы в библиотеке STL? Каково их основное назначение?
- Для чего нужны адаптеры функторов bind1st() и bind2nd()?
- Как применяются адаптеры-отрицатели?
- Почему алгоритмы remove() не удаляют элементы из контейнеров? Как реально удалить элементы из контейнера?
- Чем отличается стабильная сортировка от обычной?
- Какую функцию выполняет алгоритмы unique()?
- Могут ли стандартные алгоритмы работать со строками?
- Нужно ли сортировать ассоциативные контейнеры?
- Можно ли алгоритмы для работы с множествами применять для последовательных контейнеров? При каких условиях?
- Какие алгоритмы предназначены для заполнения контейнера значениями? С какими контейнерами они могут работать?
- Каким образом заполнить с помощью алгоритма generate() последовательный контейнер, не имеющий ни одного элемента?
- Перечислите алгоритмы, предназначенные для операций с каждым элементом контейнера.
- Можно ли с помощью алгоритма for_each() изменить элементы контейнера?
PS Обращаю Ваше внимание на то, что это - базовый список. В него не включены вопросы, которые обсуждаются на лекциях, поэтому не стоит считать, что они не будут заданы Вам на экзамене.
С уважением, Ковалев Антон
Это вопросы из книги: Лаптев В.В. С++. Объектно-ориентированное программирование. - Спб.: Питер, 2008. - 464 с. Первоначальный список вопросов был опубликован на сайте РСДН (27.04.06): http://rsdn.ru/?Forum/?fuid=18459