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

Перегрузка операторов

Вопросы проверяют не способность написать `operator+`, а умение сохранить смысл привычного оператора. Неправильная перегрузка может компилироваться и всё же разрушать ожидания о симметрии, транзитивности, побочных эффектах и стоимости.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 20 вопросов, время — 55 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 20
Почему `operator+` часто реализуют как свободную функцию через `operator+=`?
C++C++20
class Number {
public:
    Number& operator+=(const Number& rhs) {
        value_ += rhs.value_;
        return *this;
    }
    friend Number operator+(Number lhs, const Number& rhs) {
        lhs += rhs;
        return lhs;
    }
private:
    int value_ = 0;
};
Вопрос 2 из 20
Какой возвращаемый тип типичен для `T& operator+=(const T&)`?
C++C++20
class Matrix {
public:
    Matrix& operator+=(const Matrix& rhs) {
        add_in_place(rhs);
        return *this;
    }
};

(a += b) += c;
Вопрос 3 из 20
Какое значение получится у (a + b).v при реализации operator+ через operator+=?
C++C++20
#include <iostream>
struct N {
    int v;
    N& operator+=(const N& x){ v += x.v; return *this; }
};
N operator+(N a, const N& b){ return a += b; }
int main(){ N a{2}, b{5}; std::cout << (a+b).v; }
Вопрос 4 из 20
Какая перегрузка нужна, чтобы работало выражение `2 + Number{3}`, если Number имеет неявный конструктор из int?
C++C++20
class Number {
public:
    Number(int value) : value_(value) {}
    friend Number operator+(Number lhs, const Number& rhs) {
        lhs.value_ += rhs.value_;
        return lhs;
    }
private:
    int value_;
};

auto x = 2 + Number{3};
Вопрос 5 из 20
Почему арифметический `operator+` обычно не должен менять левый операнд?
C++C++20
Number a{2};
Number b{3};
Number c = a + b;

// После выражения a и b обычно должны сохранить прежние значения.
std::cout << a << ' ' << b << ' ' << c;
Вопрос 6 из 20
Какое свойство обязательно для корректного operator==?
Вопрос 7 из 20
Почему сравнение double через точное `a == b` может быть неверно для результатов вычислений?
C++C++20
double a = 0.1 + 0.2;
double b = 0.3;

std::cout << std::boolalpha << (a == b);
// Для предметного типа может понадобиться явная политика допуска.
Вопрос 8 из 20
Что может сгенерировать компилятор из `auto operator<=>(const X&) const = default;`?
C++C++20
struct Version {
    int major;
    int minor;
    auto operator<=>(const Version&) const = default;
};

static_assert(Version{1,2} < Version{2,0});
Вопрос 9 из 20
Что требуется от компаратора для `std::sort`?
C++C++20
std::vector<Item> items = load_items();
std::sort(items.begin(), items.end(),
    [](const Item& a, const Item& b) {
        return a.priority < b.priority;
    });
Вопрос 10 из 20
Почему сравнение объектов только по `name`, если equality учитывает ещё `id`, может быть проблемой в `std::set`?
C++C++20
struct User {
    int id;
    std::string name;

    friend bool operator==(const User&, const User&) = default;
    friend bool operator<(const User& a, const User& b) {
        return a.name < b.name;
    }
};

std::set<User> users;
Вопрос 11 из 20
Какая сигнатура типична для вывода пользовательского типа?
C++C++20
struct Point { int x, y; };

std::ostream& operator<<(std::ostream& out, const Point& p) {
    return out << '(' << p.x << ", " << p.y << ')';
}
Вопрос 12 из 20
Зачем operator<< возвращает std::ostream&?
Вопрос 13 из 20
Должен ли operator<< быть friend класса?
Вопрос 14 из 20
Какую ошибку содержит реализация?
C++C++20
std::ostream& operator<<(std::ostream& out, const X& x) {
    std::cout << x.value();
    return out;
}
Вопрос 15 из 20
Как безопасно временно изменить формат потока внутри operator<< и восстановить его?
Вопрос 16 из 20
Можно ли изменить приоритет операторов перегрузкой?
Вопрос 17 из 20
Можно ли создать новый оператор, например `**` для степени?
C++C++20
struct Number {
    int value;
    friend Number operator*(Number a, Number b) {
        return {a.value * b.value};
    }
};

// Синтаксис a ** b добавить нельзя: такого оператора в языке нет.
Вопрос 18 из 20
Почему перегрузка `operator&&` не сохраняет поведение встроенного &&?
C++C++20
struct Flag {
    bool value;
};

bool operator&&(Flag left, Flag right) {
    return left.value && right.value;
}

bool result = make_left() && make_right();
Вопрос 19 из 20
Какой контракт естественен для `operator[]` контейнера?
C++C++20
class Buffer {
public:
    std::byte& operator[](std::size_t i) { return data_[i]; }
    const std::byte& operator[](std::size_t i) const { return data_[i]; }
private:
    std::vector<std::byte> data_;
};
Вопрос 20 из 20
Почему `operator bool` часто объявляют explicit?
C++C++20
class FileHandle {
public:
    explicit operator bool() const noexcept { return handle_ != invalid; }
private:
    NativeHandle handle_ = invalid;
};

if (file) read(file);
// int n = file; // неявное числовое преобразование не нужно

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

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

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

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