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

Копирование и перемещение

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

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 20 вопросов, время — 55 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 20
Какая сигнатура является обычным конструктором копирования?
C++C++20
class Buffer {
public:
    Buffer(const Buffer& other);
    Buffer(Buffer&& other) noexcept;
    Buffer& operator=(const Buffer& other);
private:
    std::unique_ptr<std::byte[]> data_;
};
Вопрос 2 из 20
Почему побитовое копирование класса с владеющим `char*` опасно?
C++C++20
struct Text {
    char* data;
    std::size_t size;
};

Text a{duplicate("hello"), 5};
Text b = a;           // копируются только адрес и size
delete[] a.data;
std::cout << b.data;
Вопрос 3 из 20
Что произойдёт при передаче Derived по значению в функцию, принимающую Base?
C++C++20
struct Base { virtual ~Base() = default; };
struct Derived : Base { int extra = 7; };
void use(Base value);
Derived d;
use(d);
Вопрос 4 из 20
Как запретить копирование объекта?
C++C++20
class Socket {
public:
    Socket(const Socket&) = delete;
    Socket& operator=(const Socket&) = delete;
    Socket(Socket&&) noexcept = default;
    Socket& operator=(Socket&&) noexcept = default;
};
Вопрос 5 из 20
Когда передача большого объекта по const-ссылке обычно лучше передачи по значению?
Вопрос 6 из 20
Что на самом деле делает `std::move(x)`?
C++C++20
std::string source = "payload";
std::string&& ref = std::move(source);

// До вызова конструктора или присваивания данные не переносились.
std::string target(std::move(ref));
Вопрос 7 из 20
Почему перемещение из `const T` часто превращается в копирование?
C++C++20
struct Item {
    Item(const Item&);
    Item(Item&&) noexcept;
};

const Item source;
Item target = std::move(source);
Вопрос 8 из 20
Какое состояние должен иметь источник после корректного перемещения?
Вопрос 9 из 20
Почему перемещающий конструктор пользовательского типа желательно объявлять `noexcept`, если он действительно не бросает исключений?
Вопрос 10 из 20
Какой конструктор A сработает при создании b из std::move(a)?
C++C++20
#include <iostream>
#include <utility>
struct A {
    A() = default;
    A(const A&) { std::cout << "copy"; }
    A(A&&) noexcept { std::cout << "move"; }
};
int main(){ A a; A b(std::move(a)); }
Вопрос 11 из 20
Какие функции входят в правило пяти?
Вопрос 12 из 20
Что означает правило нуля?
Вопрос 13 из 20
Как пользовательский деструктор может повлиять на неявное перемещение?
Вопрос 14 из 20
Какую технику часто используют для безопасного copy-присваивания владеющего типа?
Вопрос 15 из 20
Какое объявление уместно для типа, который можно только перемещать?
Вопрос 16 из 20
Можно ли присвоить новое значение строке после перемещения из неё?
Вопрос 17 из 20
Какое утверждение о `source.empty()` сразу после `target = std::move(source)` переносимо?
C++C++20
std::string source = read_text();
std::string target = std::move(source);

// Какое из утверждений о source переносимо?
log(source.size());
source = "reused";
Вопрос 18 из 20
Почему присваивание `x = std::move(x)` стоит учитывать в пользовательском move-операторе?
C++C++20
Buffer& Buffer::operator=(Buffer&& other) noexcept {
    if (this == &other) return *this;
    release();
    data_ = std::exchange(other.data_, nullptr);
    size_ = std::exchange(other.size_, 0);
    return *this;
}

buffer = std::move(buffer);
Вопрос 19 из 20
Какой код безопаснее после передачи unique_ptr?
C++C++20
auto p = std::make_unique<int>(9);
auto q = std::move(p);
Вопрос 20 из 20
Зачем пользовательскому типу определить ясное moved-from состояние, если это дёшево?

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

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

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

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