Regel van Drie/Vijf
Beheer kopiëren en verplaatsen correct
Regel van Drie/Vijf is een gratis C++ Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.
De regel van drie
Als een klasse een aangepaste destructor nodig heeft, heeft ze bijna altijd ook een aangepaste kopieerconstructor en kopietoewijzing nodig. Deze drie horen bij elkaar.
Waarom drie?
Een klasse die rechtstreeks een resource beheert, moet definiëren hoe die wordt vernietigd, gekopieerd en toegewezen — anders veroorzaken de door de compiler gegenereerde ondiepe kopieën dubbele vrijgaven.
#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!
};Aangepaste kopieerconstructor
Een correcte kopieerconstructor maakt een diepe kopie en wijst daarvoor een eigen resource toe in plaats van die te delen.
#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";
}Aangepaste kopietoewijzing
Bij kopietoewijzing moet je de oude resource vrijgeven, jezelf beschermen tegen toewijzing aan jezelf en de nieuwe waarde diep kopiëren.
Box& operator=(const Box& o) {
if (this != &o) { // self-assignment guard
delete p;
p = new int(*o.p);
}
return *this;
}De regel van vijf
C++11 voegt verplaatsingsbewerkingen toe. Als je een van de vijf definieert (destructor, kopieerconstructor, kopietoewijzing, verplaatsingsconstructor, verplaatsingstoewijzing), overweeg dan om ze alle vijf te definiëren.
Verplaatsingsconstructor
Een verplaatsingsconstructor steelt de resource van een tijdelijk object en laat de bron leeg achter — veel goedkoper dan kopiëren.
Box(Box&& o) noexcept : p(o.p) {
o.p = nullptr; // source left empty
}Verplaatsingstoewijzing
Verplaatsingstoewijzing geeft de huidige resource vrij en neemt vervolgens het eigendom van die van de bron over.
Box& operator=(Box&& o) noexcept {
if (this != &o) {
delete p;
p = o.p;
o.p = nullptr;
}
return *this;
}Verplaatsingen de aanduiding noexcept geven
Verplaatsingsbewerkingen moeten noexcept zijn, zodat containers zoals std::vector ze veilig kunnen gebruiken bij het opnieuw toewijzen van opslag.
De regel van nul
Het beste is om helemaal niets rechtstreeks te bezitten. Gebruik std::unique_ptr, std::vector of std::string en je hoeft geen van de vijf te definiëren — de standaardbewerkingen van de compiler zijn correct.
#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
};Bewerkingen verwijderen
Als kopiëren geen zin heeft, verwijder je de bewerking: Box(const Box&) = delete;. Zo maak je het type bewust alleen-verplaatsbaar of niet-kopieerbaar.
De juiste regel kiezen
Streef naar de regel van nul. Val alleen terug op de regel van vijf wanneer je daadwerkelijk een rechtstreekse resource inpakt die de standaardbibliotheek niet afdekt.
Korte controle
Toets je begrip van de regel van drie/vijf.
Samenvatting
Je hebt de regel van drie/vijf geleerd: als je een rechtstreekse resource beheert, moet je destructor-, kopieer- en verplaatsingsbewerkingen consistent definiëren. Geef verplaatsingen de aanduiding noexcept. Het beste is om de regel van nul te volgen door standaardtypen met RAII te gebruiken en niets zelf te definiëren.
Leer C++ met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 51
- Lessen
- 203
Veelgestelde vragen
Is de les “Regel van Drie/Vijf” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “Regel van Drie/Vijf”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.
Wat leer ik in “Regel van Drie/Vijf”?
Beheer kopiëren en verplaatsen correct Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C++ Academy te beginnen?
Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Regel van Drie/Vijf”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C++ Academy?
Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Het RAII-principe
- Destructors en opruimen
- Regel van Drie/Vijf
- Scope guards