Skip to content

Вопросы

Alexandr Akulich edited this page Jun 23, 2016 · 10 revisions

Table of Contents

Общая информация

Полноценный и достаточный ответ на каждый вопрос можно уместить на пол страницы, в некоторых случаях на ⅔.

Для большей части вопросов можно использовать книгу, но учтите, что некоторая информация в ней устарела. Это касается в первую очередь ключевого слова auto, но может быть есть что-то ещё.

1. Встроенные типы данных и их модификаторы

Типы: void, bool, char, int, float, double.

Модификаторы: short, long, signed, unsigned.

Минимальное и максимальное значение целых чисел.

Ограниченная точность чисел с плавающей точкой.

Представление чисел

Представление целых чисел понадобится в вопросе 18.

Насчёт представления чисел с плавающей точкой достаточно сказать, что оно состоит из мантиссы, показателя степени и знака числа.

Отличный ответ

Рассказать о недостатках встроенных целочисленных типов.

2. Функции, передача аргументов, аргументы по-умолчанию

3. Указатели. Объявление, инициализация. Операции с указателями

4. Массивы

Расположение в памяти, передача в виде аргумента.

Отличный ответ

Рассказать о недостатках использования массивов.

5. Циклы. Виды и синтаксис

for (обычный и ranged), while, do while.

6. Модификаторы доступа

Нужно рассказать, о том, какие бывают модификаторы доступа (public, protected и private) и зачем они нужны.

Конечно, нужно сказать о том, что модификаторы доступа применяются только к классам (в широком смысле).

Рассказать о ключевых словах class и struct. Структуры — это классы с доступом public по-умолчанию. В обычных классах доступ по умолчанию — private.

Будет хорошим бонусом информация о public/protected/private наследовании, но пятерку за экзамен можно получить и без этого.

Нужны логически (архитектурно, идейно) обоснованные примеры использования public, protected и private.

Отличный ответ

Рассказать о friend классах и функциях.

7. Методы. Объявление, определение и вызов

7.1 Общее описание

Расскажите о том, зачем нужны методы и в чём их отличие от (обычных) функций.

7.2 Виды методов

Тут можно придумать множество вариантов классификации. "Придумайте" хотя бы три, а лучше - больше (я придумал шесть). Не нужно это гуглить (я сомневаюсь, что это где-нибудь написано), нужно просто подумать

7.3 Объявление метода (declaration)

(приведите пример, а лучше - два)

7.4 Определение метода (definition)

(приведите пример, а лучше - два)

7.5 Вызов

(приведите пример, а лучше - два).

Расскажите о неявных параметрах. Расскажите, о том, в какой части кода доступны (для вызова) различные методы.

8. Операции с битами. Битовый сдвиг

9. Области видимости и пространства имён

scope, namespace

10. Перечисления. Классы перечислений

enum; enum class.

Почитайте про типобезопасность: https://ru.wikipedia.org/wiki/Типобезопасность.

В контексте С++ и перечислений типобезопасность говорит о том, что простое перечисление может быть автоматически преобразовано в целый тип (int), а enum class — нет. То есть enum class безопаснее, чем enum.

Посмотрите на код:

enum FigureType {
    Rectangle,
    Circle,
    Triangle,
};

enum DrawPrimitive {
    Polygon,
    Quad,
};

void printType(int type)
{
    switch (type) {
    case Rectangle:
        printf("Rectangle");
        break;
    case Circle:
        printf("Circle");
        break;
    case Triangle:
        printf("Triangle");
        break;
    }
}

int main(int argc, char *argv[])
{
    printType(Quad);
    return 0;
}

Если бы DrawPrimitive был enum class, то компилятор искал бы функцию void printType(DrawPrimitive type) и выдал ошибку из-за того, что такая функция не найдена. В свою очередь, использование правильной сигнатуры сделало бы текущую логическую ошибку (использование Quad типа DrawPrimitive в функции, реализация которой ожидает FigureType) синтаксической.

Простой enum слабо типизирован, поэтому он может быть автоматически преобразован в int, что не даёт компилятору обнаружить возможные ошибки.

В Си++ многие ключевые слова (const, override, final, public, protected, private и т.д) используются в первую очередь для того, чтобы позволить компилятору найти ошибки во время компиляции, избавив программу от ошибок времени выполнения.

11. Статические поля и методы классов

12. Использование препроцессора

Директивы: #include, #define, #ifdef, #else, #elif, #endif

Отличный ответ

Рассказать, зачем нужна директива #error, на одном или двух примерах рассказать про #pragma.

13. Применение ключевого слова virtual

Виртуальные и абстрактные методы.

Шикарный ответ

Если кто-то хочет сдать на шесть по пятибальной — расскажите про виртуальное наследование.

14. Механизм создания и разрушение объектов

Операторы new и delete. Конструкторы и деструкторы.

Отличный ответ

Отличный ответ включает в себя объяснение важности виртуального деструктора.

15. Классы памяти

Плохой ответ

Нет ничего хуже, чем сказать, что auto используется для указания автоматического размещения в памяти.

16. Пользовательские типы данных

Классы, структуры, перечисления. typedef

17. Операторы логического ветвления

if, switch/case

Отличный ответ

Рассказать про switch по перечислению без секции default.

18. Аппаратные и программные платформы

Размеры основных типов и порядок байтов. Портирование программ. WinAPI, Posix.

19. Компиляторы. Особенности компиляторов и их совместимость

gcc, msvc, clang.

20. Этапы компиляции программы

21. Организация памяти программы

стек, куча, сегмент данных и сегмент кода

22. Статический и динамический полиморфизм

Другими словами — перегрузка (overload) и переопределение (override) функций.

Статический — вызываемый метод определяется на этапе компиляции. (Перегрузка функций)

Динамический — вызываемый метод определяется при выполнении программы. (Переопределение функций)

23. Неявное преобразование типов

Применение explicit конструкторов и операторов приведения типа.

24. RAII

Resource Acquisition Is Initialization

25. Автоматически генерируемые методы

26. Встраивание функций

inline

Рассказать, какие функции могут быть встроенными. Объявснить, как использование inline может снизить производительность.

27. Рекурсия

Рассказать, зачем нужна и в чём может быть проблема рекурсивного вызова.

28. RTTI

Run-Time Type Information

static_cast, dynamic_cast (, qobject_cast).

29. Шаблоны проектирования

Нужно рассказать, зачем они нужны.

singleton

30. Ошибки при программировании

Ошибки и предупреждения при компиляции и связывании (compile и link time). Ошибки во время выполнения программы (runtime).

Clone this wiki locally