Regola del tre/cinque
Gestire correttamente copia e spostamento
Regola del tre/cinque è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
La regola del tre
Se una classe richiede un distruttore personalizzato, quasi sempre richiede anche un costruttore di copia e un'operazione di assegnazione per copia personalizzati. Questi tre elementi vanno insieme.
Perché tre?
Una classe che gestisce una risorsa grezza deve definire come distruggerla, copiarla e assegnarla; altrimenti le copie superficiali generate dal compilatore causano doppi rilasci.
#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!
};Costruttore di copia personalizzato
Un costruttore di copia corretto esegue una copia profonda, allocando una propria risorsa invece di condividerla.
#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";
}Assegnazione di copia personalizzata
L'assegnazione di copia deve liberare la vecchia risorsa, gestire l'autoassegnazione ed eseguire una copia profonda del nuovo valore.
Box& operator=(const Box& o) {
if (this != &o) { // self-assignment guard
delete p;
p = new int(*o.p);
}
return *this;
}La Regola del Cinque
C++11 aggiunge le operazioni di spostamento. Se definisce una qualsiasi delle cinque operazioni (distruttore, costruttore di copia, assegnazione di copia, costruttore di spostamento, assegnazione di spostamento), consideri di definirle tutte.
Costruttore di spostamento
Un costruttore di spostamento acquisisce la risorsa da un oggetto temporaneo e lascia vuoto l'oggetto sorgente: è molto meno costoso della copia.
Box(Box&& o) noexcept : p(o.p) {
o.p = nullptr; // source left empty
}Assegnazione di spostamento
L'assegnazione di spostamento rilascia la risorsa corrente, quindi acquisisce la proprietà di quella dell'oggetto sorgente.
Box& operator=(Box&& o) noexcept {
if (this != &o) {
delete p;
p = o.p;
o.p = nullptr;
}
return *this;
}Contrassegnare gli spostamenti come noexcept
Le operazioni di spostamento dovrebbero essere noexcept, così i contenitori come std::vector possono utilizzarle in sicurezza durante il riallocamento.
La Regola dello Zero
La soluzione migliore è non possedere direttamente alcuna risorsa. Utilizzi std::unique_ptr, std::vector o std::string e non dovrà definire nessuna delle cinque operazioni: le impostazioni predefinite del compilatore sono corrette.
#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
};Eliminare le operazioni
Se la copia non ha senso, la elimini: Box(const Box&) = delete;. In questo modo il tipo diventa intenzionalmente solo spostabile o non copiabile.
Scegliere la regola corretta
Punti alla Regola dello Zero. Ricorra alla Regola del Cinque solo quando avvolge realmente una risorsa grezza non gestita dalla libreria standard.
Verifica rapida
Verifichi la comprensione della Regola del Tre/Cinque.
Riepilogo
Ha imparato la Regola del Tre/Cinque: gestire una risorsa grezza significa definire in modo coerente distruttore e operazioni di copia e spostamento. Contrassegni gli spostamenti come noexcept. La soluzione migliore è seguire la Regola dello Zero, utilizzando tipi RAII standard e non definendo nessuna di queste operazioni.
Impara C++ con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Regola del tre/cinque» è gratuita?
Sì — il testo completo di «Regola del tre/cinque» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Regola del tre/cinque»?
Gestire correttamente copia e spostamento Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Regola del tre/cinque»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il principio RAII
- Distruttori e pulizia
- Regola del tre/cinque
- Guardie di ambito