0Pricing
C++ Academy · Aula

Regra dos três/cinco

Gerencie cópia e movimentação corretamente

Regra dos três/cinco é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 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.

A regra dos três

Se uma classe precisa de um destrutor personalizado, quase sempre também precisa de um construtor de cópia e de uma atribuição de cópia personalizados. Esses três elementos andam juntos.

Por que três

Uma classe que gerencia um recurso bruto precisa definir como ele será destruído, copiado e atribuído — caso contrário, as cópias rasas geradas pelo compilador causarão liberações duplas.

#include <iostream>

class Bad {
    int* p;
public:
    Bad(int v) : p(new int(v)) {}
    ~Bad() { delete p; }
    // default copy => two objects delete the same p!
};

Construtor de cópia personalizado

Um construtor de cópia correto realiza uma cópia profunda, alocando seu próprio recurso em vez de compartilhá-lo.

#include <iostream>

class Box {
    int* p;
public:
    Box(int v) : p(new int(v)) {}
    Box(const Box& o) : p(new int(*o.p)) {}   // deep copy
    ~Box() { delete p; }
    int get() const { return *p; }
};

int main() {
    Box a(5);
    Box b = a;   // independent copy
    std::cout << b.get() << "\n";
}

Atribuição de cópia personalizada

A atribuição de cópia deve liberar o recurso antigo, proteger contra a autoatribuição e realizar uma cópia profunda do novo valor.

Box& operator=(const Box& o) {
    if (this != &o) {              // self-assignment guard
        delete p;
        p = new int(*o.p);
    }
    return *this;
}

A Regra dos Cinco

O C++11 acrescenta operações de movimentação. Se definir qualquer uma das cinco (destrutor, construtor de cópia, atribuição de cópia, construtor de movimentação, atribuição de movimentação), considere definir todas as cinco.

Construtor de movimentação

Um construtor de movimentação toma o recurso de um temporário e deixa a origem vazia — muito mais barato do que copiar.

Box(Box&& o) noexcept : p(o.p) {
    o.p = nullptr;   // source left empty
}

Atribuição de movimentação

A atribuição de movimentação libera o recurso atual e então assume a propriedade do recurso da origem.

Box& operator=(Box&& o) noexcept {
    if (this != &o) {
        delete p;
        p = o.p;
        o.p = nullptr;
    }
    return *this;
}

Marque as movimentações como noexcept

As operações de movimentação devem ser noexcept para que contêineres como std::vector possam usá-las com segurança durante a realocação.

A Regra do Zero

O melhor é não possuir nenhum recurso bruto. Use std::unique_ptr, std::vector ou std::string e não precisará definir nenhuma das cinco — os padrões do compilador estarão corretos.

#include <memory>

class Good {
    std::unique_ptr<int> p;   // owns the resource for you
public:
    Good(int v) : p(std::make_unique<int>(v)) {}
    // no destructor, no copy/move needed
};

Exclusão de operações

Se a cópia não fizer sentido, exclua-a: Box(const Box&) = delete;. Assim, o tipo se torna somente-móvel ou não copiável de propósito.

Escolhendo a regra correta

Busque a Regra do Zero. Recorra à Regra dos Cinco somente quando realmente encapsular um recurso bruto que a biblioteca padrão não cobre.

Verificação rápida

Teste sua compreensão da Regra dos Três/Cinco.

Recapitulação

Você aprendeu a Regra dos Três/Cinco: gerenciar um recurso bruto significa definir de forma consistente as operações de destruição, cópia e movimentação. Marque as movimentações como noexcept. O melhor é seguir a Regra do Zero, usando tipos RAII padrão e não definindo nenhuma dessas operações.

Perguntas Frequentes

A aula “Regra dos três/cinco” é grátis?

Sim — o texto completo de “Regra dos três/cinco” é 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 “Regra dos três/cinco”?

Gerencie cópia e movimentação corretamente 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 3 de 4.

Quanto tempo leva a aula “Regra dos três/cinco”?

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. O princípio RAII
  2. Destrutores e limpeza
  3. Regra dos três/cinco
  4. Guardas de escopo
← Voltar para C++ Academy