Вопросы по C++ (часть 2)

Вторая часть ответов на интервью-вопросы на знание языка программирования C++.

26) Что такое инкапсуляция

Инкапсуляцией называют скрытие деталей реализации внутри класса. При использовании механизма инкапсуляции объекты защищаются от произвольного изменения (с помощью ключевых слов protected или private); взаимодействие с объектом происходит с помощью публичных функций-членов.

27) Что такое перегрузка функций?

С помощью перегрузки имеется возможность определять функции, имеющие одно и то же имя, но разный набор аргументов и/или возвращающие разные результаты.

28) Что такое множественное наследование?

Множественное наследование позволяет определить производный класс, который будет наследовать члены от нескольких базовых классов.

29) Что такое перегрузка операторов?

Аналогично перегрузке функций это возможность ЯП определить поведение оператора, при передаче ему разных аргументов.

30) Что такое частичная специализация шаблона?

Частичная специализация шаблона позволяет явно задать параметры основного шаблона и доопределить полученный шаблон в соответствие с его назначением.

31) Что такое полиморфизм?

Свойство языка, позволяющая определить разное поведение для объектов с одинаковой спецификацией.

Пример 1: производный класс наследует публичный интерфейс базового класса, но с помощью перекрытия изменяет поведение виртуальных функций.

Пример 2: перегрузка функций.

32) В чём разница между передачей аргумента по значению и передачей аргумента по ссылке?

В способе размещения аргумента в памяти. При передаче аргумента по значение он копируется в стек, а вызываемая функция работает с копией аргумента. При передаче аргумента по ссылке вызываемая функция работает с исходным аргументом, а не его копией (ссылка является псевдонимом переменной).

33) Какая разница между объектом и классом?

Класс является сложным типом, который описывает внутренние данные и функциональный интерфейс. Объект является экземпляром класса, размещаемым в памяти.

34) В чём разница между объявлением и определением функции?

В объявлении указывается формат вызова, в который входят 1) имя функции, 2) описание аргументов, передаваемых в функцию, и 3) описание возвращаемого функцией результата. В определении реализуется алгоритм работы функции.

35) -

36) В чём разница между delete и delete[]?

Ключевое слово delete используется для удаления объекта, которое происходит в два этапа. Во-первых, вызывается деструктор объекта, который, например, выполняет удаление членов класса. Во-вторых, выполняется освобождение занимаемой объектом памяти. Ключевое слово delete[] используется для удаления массива объектов, при этом для каждого элемента массива будет вызван деструктор, а затем произойдёт освобождение памяти.

37) Какая разница между вложенным (внутренним) классом и абстрактным классом?

Внутренний класс - это класс, который определён внутри другого класса. Абстрактный класс - это класс, имеющий чисто виртуальные функции-члены.

38) В чём разница между перманентным и неперманентным объектом?

Перманентный объект сохраняет своё состояние на всём протяжении жизни, в то время как неперманентный объект может изменить своё состояние.

39) Чем отличается структура (struct) от объединения (union)?

Объединение отличается от структуры способом размещения данных-членов. В объединении данные-члены делят отводимую для них область памяти так, что перекрывают друг друга. В структуре (равно как и в классе) данные-члены размещаются в своих областях памяти.

40) Чем отличается поверхностное копирование от глубокого копирования?

При поверхностном копировании будет, например, продублирован указатель на данные (появится новый объект, который ссылается на существующие данные). При глубоком копировании вместо сохранения указателя будет осуществляться полное копирование данных.

41) Какая разница между открытыми, защищёнными и закрытыми членами класса?

Разница заключается в уровнях доступа к этим членам. Открытые члены класса доступны всем. Защищённые доступны только данному классу и классам-наследникам. Закрытые члены доступны только данному классу.

42) Какую максимальную длину может иметь массив?

Это зависит от нескольких факторов. Во-первых, от способа размещения массива. При размещении на стеке размер зависит от размера стека (и его способности к расширению). При размещении в куче - от возможностей аппаратных средств и ОС. Во-вторых, размер должен укладываться в size_t, который зависит от используемой платформы (32 или 64 разряда).

43) Как наиболее эффективно инвертировать связный список?

Перейти в конец списка и двигаясь к началу менять местами указатели на следующий и предыдущий элементы списка.

44) Какой размер у пустого класса?

Размер пустого класса должен по крайней мере быть равен размеру минимально адресуемой области памяти. Обычно это 1 байт.

45) Зачем используется виртуальный деструктор?

Это единственный способ обеспечить вызов деструктора у производного класса при удалении объекта по указателю на базовый класс.

46) Что такое виртуальный класс? Что такое дружественный класс?

Виртуальный класс - это класс, имеющий виртуальные функции-члены. Дружественный класс - это класс, который имеет доступ к закрытым членам данного класса.

47. Назовите лучший способ объявить и определить глобальную переменную. Вариант 1 (C-style):

// source.c
int global = 0;
// source.h
extern int global;

Вариант 2 (С++ style): определить класс с открытой статической переменной:

// source.hpp
class A {public: static int global;};
// source.cpp
int A::global = 0;

48) В какой области памяти инстанцируется объект?

Зависит от способа размещения. Если объект является локальной переменной, то он размещается в стеке. Если объект создаётся с использованием ключевого слова new, то он размещается в куче.

49) В какой области памяти инстанцируется структура?

Аналогично объекту (см. ответ на вопрос 48).

50) Почему первый элемент массива имеет индекс 0?

Индекс массива определяет смещение относительно начала массива. Очевидно, что по смещению 0 находится первый элемент.

c++, вопросы, программирование