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
- Lvalue versus rvalue: a distinção
- Referências rvalue e a sintaxe &&
- std::move e std::forward
- Construtores de movimento e atribuição por movimento