0Pricing
C++ Academy · Aula

Construtores de movimento e atribuição por movimento

Implemente corretamente construtores de movimento e operadores de atribuição por movimento

Construtores de movimento e atribuição por movimento é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Dois membros especiais

O construtor de movimentação e o operador de atribuição por movimentação permitem que sua classe assuma a propriedade dos recursos de outra instância sem copiá-los.

Assinatura

Ambos recebem uma referência rvalue para o mesmo tipo.

class String {
public:
    String(String&& other) noexcept;          // move ctor
    String& operator=(String&& other) noexcept; // move assign
};

Implementando um construtor de movimentação

Aproxime-se dos recursos da origem e deixe-a em um estado vazio válido.

String(String&& other) noexcept
    : data_(other.data_), size_(other.size_) {
    other.data_ = nullptr;
    other.size_ = 0;
}

Implementando a atribuição por movimentação

Três etapas: libere os recursos atuais, aproprie-se dos recursos da origem e deixe a origem vazia.

String& operator=(String&& other) noexcept {
    if (this != &other) {
        delete[] data_;
        data_ = other.data_;
        size_ = other.size_;
        other.data_ = nullptr;
        other.size_ = 0;
    }
    return *this;
}

Por que noexcept é importante

Marque as operações de movimentação como noexcept sempre que possível. Contêineres padrão como std::vector só usam movimentações ao redimensionar se elas forem noexcept; caso contrário, recorrem a cópias para garantir a segurança contra exceções.

A regra dos cinco

Se você escrever qualquer um destes cinco, pense nos cinco:

  • Destrutor
  • Construtor de cópia
  • Atribuição por cópia
  • Construtor de movimentação
  • Atribuição por movimentação

A regra do zero

Melhor ainda — não escreva nenhum deles. Armazene os membros como tipos RAII (vetores, cadeias de caracteres, ponteiros inteligentes). Os padrões gerados pelo compilador funcionam de forma correta e eficiente.

class Widget {
    std::string name_;
    std::vector<int> data_;
    // No need for destructor, copy, or move — compiler does the right thing
};

Quando o compilador gera movimentações

O compilador gera membros de movimentação padrão somente quando:

  • Nenhum construtor de cópia, operador de atribuição por cópia, destrutor ou membro de movimentação foi declarado pelo usuário
  • Todos os membros e classes-base podem ser movidos

Movimentações padrão e excluídas

Você pode solicitar ou proibir explicitamente as movimentações geradas pelo compilador.

class Widget {
public:
    Widget(Widget&&) = default;
    Widget& operator=(Widget&&) = default;
    // or
    Widget(Widget&&) = delete;
};

Após uma movimentação

O objeto do qual os recursos foram movidos fica em um estado válido, mas não especificado. Você pode:

  • Destruí-lo
  • Atribuir um novo valor a ele
  • Chamar qualquer operação que não tenha uma pré-condição (size(), empty(), clear())

Casos de uso

A semântica de movimentação acelera:

  • O retorno de objetos grandes (quando o RVO não é aplicado)
  • A inserção de objetos grandes em contêineres (push_back de rvalues)
  • A implementação dos seus próprios tipos que possuem recursos

Verificação rápida

Por que os construtores de movimentação e os operadores de atribuição por movimentação devem ser marcados como noexcept?

Recapitulação

Os construtores de movimentação e os operadores de atribuição por movimentação assumem os recursos de um rvalue prestes a ser destruído. Marque-os como noexcept para obter mais velocidade nos contêineres. Siga a Regra dos Cinco — ou, melhor ainda, a Regra do Zero, compondo tipos RAII padrão.

Perguntas Frequentes

A aula “Construtores de movimento e atribuição por movimento” é grátis?

Sim — o texto completo de “Construtores de movimento e atribuição por movimento” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Construtores de movimento e atribuição por movimento”?

Implemente corretamente construtores de movimento e operadores de atribuição por movimento Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Construtores de movimento e atribuição por movimento”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Lvalue versus rvalue: a distinção
  2. Referências rvalue e a sintaxe &&
  3. std::move e std::forward
  4. Construtores de movimento e atribuição por movimento
← Voltar para C++ Academy