Изменения

Перейти к: навигация, поиск

Старые вопросы на экзамен по C++

23 754 байта добавлено, 16:34, 26 июля 2012
Нет описания правки
__TOC__
 
== Классы, контейнеры ==
# Что определяет класс? Чем обличается класс от объекта?
#: Класс определяет тип объекта, а объект - это конкретный экземпляр класса.
# Можно ли объявлять массив объектов? А массив классов?
#: Смотря что считать массивом - в обычном смысле можно объявить массив объектов, с помощью метапрограммирования можно делать списки типов(классов)
# Разрешается ли объявлять указатель на объект? А указатель на класс?
#: Да. Нет.
# Допускается ли передавать объекты в качестве параметров, и какими способами? А возвращать как результат?
#: Допускается по значению и по ссылке. Возвращать также можно значение или ссылку.
# Как называется использование объекта одного класса в качестве поля другого класса?
#: Композиция
# Является ли структура классом? Чем класс отличается от структуры?
#: Является, у структуры все поля/методы по умолчанию 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 - непонятно, как тогда вызывать методы, и могут возникать конфликты ([http://pastebin.com/fJm050jm])
#: 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
# Исключение — это:
## событие;
## обработчик прерывания;
# Какого типа может быть исключение?
#: вроде можно кинуть что угодно
# Сколько параметров разрешается писать в заголовке секции-ловушки?
# Какими способами разрешается передавать исключение в блок обработки?
#: по значению и по указателю?
# Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки.
# Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку?
# Что такое «иерархия исключений»?
# Существуют ли стандартные исключения? Назовите два-три типа стандартных исключений.
#: 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.
# Что такое делегирование и как его можно использовать для повышения степени инкапсуляции?
# Что такое «спецификации компоновки»?
# Какие объекты обладают внутренним связыванием по умолчанию?
 
== Области видимости ==
# Какие области видимости имен вы знаете?
# Для чего используются пространства имен?
#: Для какой-то логической группировки имен, и чтобы в область видимости не лезло то, что не нужно.
# Чем отличаются именованные и неименованные пространства имен?
#: К неименованному пространству имен нельзя будет обратиться откуда-то, кроме текущей единицы трансляции.
# Могут ли пространства имен быть вложенными?
#: Да
# Для чего применяются алиасы пространства имен?
#: Для удобства, чтобы каждый раз не писать длинный путь к функции или еще чему-нибудь.
# Как сделать члены пространства имен доступными в нескольких (в пределе — во всех) файлах программного проекта?
#: Вынести объявления всего что в них лежит в хедер.
# Объясните разницу между статической и динамической инициализацией.
#: Видимо, статическая - на этапе компиляции, динамичестая - в рантайме.
# В чем состоит проблема инициализации глобальных статических переменных?
#: Скорее всего в том, что непонятно, в каком порядке они инициализируются.
# Какие элементы класса можно объявлять статическими?
#: Поля и методы.
# Можно ли объявить в классе статическую константу? А константный статический массив?
#: Да. хм, надо попробовать.
# А какие статические поля можно инициализировать непосредственно в классе?
# Как определяются статические поля? В какой момент работы программы выполняется инициализация статических полей?
# Сколько места в классе занимают статические поля ?
#: нисколько
# Чем отличается статический метод от обычного?
#: Статический метод - метод класса, у него нет доступа к this.
# Какие методы класса не могут быть статическими?
#: Видимо, конструктор и деструктор?
# Какие применения статических полей вы можете привести? А каким образом применяются статические методы?
#: Тут можно привести нашу длинку, например, и то, как мы храним базу. Например, можно сделать класс со статическими методами Math(как в джаве), и реализовать там всякие математические операции, очень даже удобно.
# Приведите структуру и принцип действия паттерна Singleton.
 
== Шаблоны ==
# Для чего предназначены шаблоны?
# Какие виды шаблонов в С++ вы знаете?
# Разрешается ли определять в классе-шаблоне статические поля? А статические методы?
# Что такое «инициализация нулем»?
 
== Память ==
# Что является единицей памяти в С++? Какие требования к размеру единицы памяти прописаны в стандарте С++?
#: Байт. Чтобы в нее вмещался любой символ, причем не требуется чтобы в байте было 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.
# Какие операции определены в С++ для косвенного вызова метода через указатель?
# Что такое «функтор»? Приведите пример функционального класса.
#: Это класс с перегруженным оператором(). Например, можно сделать абстрактный интерфейс унарной функции, у которой будет виртуальный оператор().
# Какими способами функтор вызывается?
# Можно ли использовать наследование при разработке функторов?
# Приведите структуру и принцип действия паттерна 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
# Зачем нужен процесс форматирования и когда он выполняется?
#: (???) Зачем - понятно, но когда?
# Что такое «форматная строка», и в каких функциях она используется?
 
# Объясните назначение элементов спецификатора формата.
# Сколько спецификаторов формата может быть в форматной строке?
# Как установить русский шрифт при выводе в консольное окно?
# Чем отличается ли ввод/вывод широких файловых потоков от узких?
 
== STL ==
# Перечислите все последовательные контейнеры стандартной библиотеки. Чем они отличаются друг от друга?
# Перечислите адаптеры последовательных контейнеров и дайте их подробную характеристику.
''С уважением, Ковалев Антон''
 
Это вопросы из книги:
Лаптев В.В. С++. Объектно-ориентированное программирование. - Спб.: Питер, 2008. - 464 с.
Первоначальный список вопросов был опубликован на сайте РСДН (27.04.06): http://rsdn.ru/?Forum/?fuid=18459
Анонимный участник

Навигация