C++ C++  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Классы и инкапсуляция

Тест построен вокруг инвариантов: объект должен оставаться корректным не только после конструктора, но и после любого публичного вызова. Вопросы заставляют отличать удобный доступ к полям от устойчивого интерфейса и замечать места, где состояние можно испортить незаметно.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 20 вопросов, время — 55 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 20
Как порядок объявления полей влияет на результат и какую строку выведет программа?
C++C++20
#include <iostream>
struct Pair {
    int a;
    int b;
    Pair() : b(a + 1), a(1) {}
};
int main() { Pair p; std::cout << p.a << p.b; }
Вопрос 2 из 20
Что означает `inline static int count = 0;` внутри класса в C++17 и новее?
C++C++20
struct Session {
    inline static int count = 0;

    Session()  { ++count; }
    ~Session() { --count; }
};

Session a;
Session b;
Вопрос 3 из 20
Почему поле `std::string_view name_` требует особого внимания?
C++C++20
class User {
public:
    explicit User(std::string_view name) : name_(name) {}
    std::string_view name() const { return name_; }
private:
    std::string_view name_;
};

User make_user() { return User{std::string("Ann")}; }
Вопрос 4 из 20
Какой член не увеличивает размер каждого экземпляра класса?
Вопрос 5 из 20
Что лучше всего выражает необязательное поле “дата последнего входа”?
C++C++20
class Account {
public:
    void mark_login(std::chrono::system_clock::time_point when);
private:
    // Какой тип поля лучше отражает отсутствие входа?
    /* ... */ last_login_;
};
Вопрос 6 из 20
Почему статический метод не может напрямую обратиться к нестатическому полю value?
Вопрос 7 из 20
Какое значение накопит Counter после двух последовательных вызовов add?
C++C++20
#include <iostream>
struct Counter {
    int value = 0;
    void add(int n) { value += n; }
};
int main() { Counter c; c.add(1); c.add(2); std::cout << c.value; }
Вопрос 8 из 20
Зачем у геттера иногда делают две перегрузки `T& get()` и `const T& get() const`?
C++C++20
class Buffer {
public:
    std::vector<std::byte>& data() { return data_; }
    const std::vector<std::byte>& data() const { return data_; }
private:
    std::vector<std::byte> data_;
};
Вопрос 9 из 20
Как запретить получение ссылки на внутренний буфер из временного объекта?
C++C++20
class Packet {
public:
    std::span<const std::byte> bytes() const & { return data_; }
    std::span<const std::byte> bytes() const && = delete;
private:
    std::vector<std::byte> data_;
};
Вопрос 10 из 20
Какой метод логичнее объявить const?
Вопрос 11 из 20
Кто может напрямую обращаться к private-члену класса?
Вопрос 12 из 20
Почему `protected`-поле часто хуже private-поля с защищённым интерфейсом?
C++C++20
class BaseCache {
protected:
    std::vector<Entry> entries_;
};

class TimedCache : public BaseCache {
public:
    void clear_expired(); // может менять entries_ напрямую
};
Вопрос 13 из 20
Что даёт объявление `friend class Serializer;`?
C++C++20
class Document {
    friend class Serializer;
private:
    std::string title_;
    std::vector<Page> pages_;
};

class Serializer {
public:
    Json write(const Document& doc) const;
};
Вопрос 14 из 20
Какой интерфейс лучше защищает баланс банковского счёта?
Вопрос 15 из 20
Что не так с методом `std::vector<int>& items()` у класса, который обещает хранить только положительные числа?
C++C++20
class PositiveSet {
    std::vector<int> data_;
public:
    std::vector<int>& items() { return data_; }
};
Вопрос 16 из 20
Какой конструктор лучше поддерживает инвариант “denominator никогда не равен нулю”?
Вопрос 17 из 20
Почему отдельные сеттеры `set_min` и `set_max` могут быть опасны для диапазона?
C++C++20
class Range {
public:
    void set_min(int value) { min_ = value; }
    void set_max(int value) { max_ = value; }
private:
    int min_ = 0;
    int max_ = 10;
};

Range r;
r.set_min(20);
Вопрос 18 из 20
Как лучше представить состояние заказа, если допустимы только “создан”, “оплачен”, “отправлен”, “отменён”?
Вопрос 19 из 20
Какой дефект есть в методе?
C++C++20
class Stock {
    int amount = 0;
public:
    void take(int n) { amount -= n; }
};
Вопрос 20 из 20
Какое решение лучше всего предотвращает появление “пустого, но якобы действительного” идентификатора?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу