Изменения

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

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

2557 байт добавлено, 23:29, 16 июня 2011
Классы, контейнеры
#: Допускается по значению и по ссылке. Возвращать также можно значение или ссылку.
# Как называется использование объекта одного класса в качестве поля другого класса?
#: ??Композиция
# Является ли структура классом? Чем класс отличается от структуры?
#: Является, у структуры все поля/методы по умолчанию 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.
# Можно ли в качестве операции индексирования использовать операцию вызова функции ()? В чем ее преимущества перед операцией []?
#: Можно впринципе. Плюс, видимо, в том что можно передавать сколько хочешь аргументов.

Навигация