Изменения

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

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

10 728 байт добавлено, 16:34, 26 июля 2012
Нет описания правки
#: Допускается по значению и по ссылке. Возвращать также можно значение или ссылку.
# Как называется использование объекта одного класса в качестве поля другого класса?
#: ??Композиция
# Является ли структура классом? Чем класс отличается от структуры?
#: Является, у структуры все поля/методы по умолчанию public, у класса - private.
#: Инкапсуляция - сокрытие методов и полей класса от пользователя, в целях сохранения внутренних инвариантов. При этом то, что помечено как public, называется интерфейсом класса.
# Что такое композиция?
#: ??Это создание нового класса путем объединения уже существующих в единую структуру.
# Для чего используются ключевые слова public и private?
#: см. инкапсуляция, также при public - наследовании все члены базового класса наследуются с теми же модификаторами, при private - все члены базового класса становятся private.
#: sizeof(a)
# Каков размер «пустого» объекта?
#: Здесь вроде понятно, что он должен быть ненулевой(у меня 1 байт, например), вопрос только почему?там добавляется фейковый член чтобы вообще можно было как-то хранить его в памяти.
# Влияют ли методы на размер объекта?
#: Если есть виртуальные методы, то размер увеличивается засчет указателся на таблицу виртуальных функций.
#: =, [], (), ->. Вопрос - почему?
# Дайте определение дружественной функции. Как объявляется дружественная функция? А как определяется?
#: Дружественная для данного класса функция - которой предоставлен доступ к private и protected членам. Функция объявляется внутри класса, к которому надо предоставить доступ, определяется там, где нужно(уже без модификатора friend).
# Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода.
#: Конструктор - функция, которая вызывается при просто объявлении(конструктор по умолчанию) или инициализации объекта. Назначение - получать объект класса с какими-то начальными параметрами. Конструктор для данного можно вызвать только один раз.
#: Инициализировать ее можно только через список инициализации. Можно еще static const, ее нужно инициализировать сразу при объявлении
# В каком порядке инициализируются поля в классе? Совпадает ли этот порядок с порядком перечисления инициализаторов в списке инициализации конструктора?
#: В порядке объявления. Нет.
# Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений?
#: Где бы это найти?
# Какой вид конструктора фактически является конструктором преобразования типов?
#: Видимо, любой неявный констркуторот одного аргумента.
# Для чего нужны функции преобразования? Как объявить такую функцию в классе?
#: Что это??
# Как запретить неявное преобразование типа, выполняемое конструктором инициализации?
#: Для этого есть ключевое слово explicit
# Какие проблемы могут возникнуть при определении функций преобразования?
#: ????
# Для чего служит ключевое слово explicit?
#: Чтобы не позволить вызвать конструктор от одного аргумента неявно.
# Влияет ли наличие целочисленных констант-полей на размер класса?
#: Они ничем не отличаются от обычных не-const полей.
# Разрешается ли объявлять массив в качестве поля класса. Как присвоить элементам массива начальные значения?
#: Разрешается, надо написать что-нибудь вроде int a[] = {1, 2, 3};
#: Это какие-то параметры класса. Определяются с помощью ключевого слова 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.
# Можно ли в качестве операции индексирования использовать операцию вызова функции ()? В чем ее преимущества перед операцией []?
#: Можно впринципе. Плюс, видимо, в том что можно передавать сколько хочешь аргументов.
## обработчик прерывания;
# Какого типа может быть исключение?
#: вроде можно кинуть что угодно
# Сколько параметров разрешается писать в заголовке секции-ловушки?
# Какими способами разрешается передавать исключение в блок обработки?
#: по значению и по указателю?
# Объясните, каким образом преодолеть ограничение на передачу единственного параметра в блок обработки.
# Почему нельзя выполнять преобразования типов исключений при передаче в секцию-ловушку?
# Что такое «иерархия исключений»?
# Существуют ли стандартные исключения? Назовите два-три типа стандартных исключений.
#: runtime_error, bad_alloc
# Поясните «взаимоотношение» исключений и деструкторов.
# Объясните, зачем может понадобиться подмена стандартных функций завершения.
#: Простое и множественное?
# Чем отличается модификатор доступа protected от модификаторов private и public?
#: ну очевидно
# Чем открытое наследование отличается от закрытого и защищенного?
#: тоже очевидно -
#:: какие все тут, блин, умные, всем всё очевидно.
#::: а вот и не очевидно, читайте книги, читайте страуструпа
# Какие функции не наследуются?
#: Чисто виртуальные
# Сформулируйте правила написания конструкторов в производном классе.
#: ???
# Каков порядок вызова конструкторов? А деструкторов?
#: Конструкторы - сначала базовый, потом производный. Деструкторы наоборот.
# Можно ли в производном классе объявлять новые поля? А методы?
#: да. да
# Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?
#: конфликта не будет
# Что происходит, если имя метода-наследника совпадает с именем базового метода?
#: Метод перегружается, вроде как
# Сформулируйте принцип подстановки.
#: Если это принцип подстановки Лисков, то: свойство, верное для базового класса, должно выполняться и для наследника
# Когда выполняется понижающее приведение типов?
#: Это приведение ссылки на базовый класс к производному.
# Объясните, что такое «срезка» или «расщепление».
#: Что Видимо, это???копирование полей производного объекта в базовый тип.
# Объясните, зачем нужны виртуальные функции.
#: Чтобы перегрузить их поведение при наследовании.
#: наследуются по определению :)
# Каковы особенности вызова виртуальных функций в конструкторах и деструкторах?
#: Виртуальные функции, вызванные из конструкторов и деструкторов не будут виртуальными.
# Можно ли сделать виртуальной перегруженную операцию, например, сложение?
#: Можно
#: чтобы можно было удалять объекты по указателю на базовый класс.
# Наследуется ли определение чистой виртуальной функции?
#: ДаНет. У чистой виртуальной функции нет смысла в определении.
# Приведите классификацию целей наследования.
#: Что это??Специализация базового класса. Реализация интерфейса базового класса(классов). Ограничение базового класса(адаптеры).
# Объясните разницу наследования интерфейса от наследования реализации.
#: ???Видимо, наследование интерфейса - public - наследование, реализации - protected?
== Компиляция ==
# Чем отличаются стандартные заголовки <string>, <string.h> и <cstring>?
#: <string> - строки C++, библиотеки STL. <string.h> - Строки C. <cstring> - то же, что <string.h>, но все обернуто в пространство имен std.
 
== Часть 5 ==
# Объясните суть идиомы 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.
# Что такое «стратегия распределения памяти», и какие стратегии выделения памяти вы знаете?
# Рассмотрите следующую стратегию распределения памяти: память выделяется для нескольких элементов блоками фиксированной длины, но блоки связываются в список. Для какого вида контейнера можно использовать такую стратегию?
 
== Часть 7 ==
# Какие операции можно перегрузить для доступа к элементам двумерного массива?
# В чем заключаются сложности использования операции индексирования [] для доступа к элементам двумерного массива?
# Какие операции определены в С++ для косвенного вызова метода через указатель?
# Что такое «функтор»? Приведите пример функционального класса.
#: Это класс с перегруженным оператором(). Например, можно сделать абстрактный интерфейс унарной функции, у которой будет виртуальный оператор().
# Какими способами функтор вызывается?
# Можно ли использовать наследование при разработке функторов?
# Приведите структуру и принцип действия паттерна Adapter.
# Сформулируйте основную проблему множественного наследования.
#: Читай ромбическое наследование(diamond problem)
# Выполняется ли принцип подстановки при открытом множественном наследовании?
# Что такое виртуальное наследование? Каковы его преимущества и недостатки по сравнению с обычным наследованием?
# Объясните, каким образом с помощью виртуального наследования можно вообще запретить наследование.
# Какие средства С++ составляют RTTI?
#: dynamic cast и typeid
# Объясните разницу между повышающим, понижающим и перекрестным приведением.
# Какими свойствами должен обладать класс, чтобы с ним работал механизм RTTI?
# В чем приведение указателей отличается от приведения ссылок?
# Какие исключения связаны с механизмом RTTI?
 
== Ввод-вывод ==
# Что такое «поток» — дайте определение.
#: Поток - абстрактный объект, который представляет собой определенное устройство для выполнения операций ввода/вывода. Обычно представляет собой источник/получатель символов неопределенной длины. Чаще всего ассоциируются с физическими источниками/получателями символов, такие как файлы, клавиатура, консоль, etc
# Как классифицируются потоки, реализованые в библиотеках ввода/вывода С++?
#: (???) Вопрос под вопросом.
# Что такое буферизация и зачем она нужна?
 == Часть 8 ==#: Буферизация нужна для более эффективной передачи данных: поток с буферизацией собирает символы в 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
# Зачем нужен процесс форматирования и когда он выполняется?
#: (???) Зачем - понятно, но когда?
# Что такое «форматная строка», и в каких функциях она используется?
 
# Объясните назначение элементов спецификатора формата.
# Сколько спецификаторов формата может быть в форматной строке?
# Объясните назначение функции fseek().
# Чем отличается функция ftell() от функции fgetpos()?
== Часть 9 ==
# Объясните, что означает «перенаправление» потока? Какие потоки можно перенаправлять и куда?
# Каким образом перенаправление ввода можно использовать для ввода строк с пробелами?
# Как установить русский шрифт при выводе в консольное окно?
# Чем отличается ли ввод/вывод широких файловых потоков от узких?
 
== STL ==
# Перечислите все последовательные контейнеры стандартной библиотеки. Чем они отличаются друг от друга?
# Перечислите адаптеры последовательных контейнеров и дайте их подробную характеристику.
# Перечислите методы контейнера list, предназначенные для вставки удаления и замены элементов. Отличаются ли эти методы от соответствующих методов вектора и дека?
# Каким образом выполняются операции сравнения контейнеров?
== Часть 10 ==
# Разрешается ли изменять элемент ассоциативного контейнера, доступный в данный момент по итератору?
# Какие контейнеры называются ассоциативными и почему?
''С уважением, Ковалев Антон''
 
Это вопросы из книги:
Лаптев В.В. С++. Объектно-ориентированное программирование. - Спб.: Питер, 2008. - 464 с.
Первоначальный список вопросов был опубликован на сайте РСДН (27.04.06): http://rsdn.ru/?Forum/?fuid=18459
Анонимный участник

Навигация