Die Regel von 3 ( die Regel von 5 im neuen c ++ - Standard) lautet:
Wenn Sie den Destruktor, den Kopierkonstruktor oder den Kopierzuweisungsoperator selbst explizit deklarieren müssen, müssen Sie wahrscheinlich alle drei explizit deklarieren.
Andererseits rät der " Clean Code " von Martin , alle leeren Konstruktoren und Destruktoren zu entfernen (Seite 293, G12: Clutter ):
Was nützt ein Standardkonstruktor ohne Implementierung? Alles, was dazu dient, ist, den Code mit bedeutungslosen Artefakten zu überladen.
Wie geht man mit diesen beiden gegensätzlichen Meinungen um? Sollten leere Konstruktoren / Destruktoren wirklich implementiert werden?
Das nächste Beispiel zeigt genau, was ich meine:
#include <iostream>
#include <memory>
struct A
{
A( const int value ) : v( new int( value ) ) {}
~A(){}
A( const A & other ) : v( new int( *other.v ) ) {}
A& operator=( const A & other )
{
v.reset( new int( *other.v ) );
return *this;
}
std::auto_ptr< int > v;
};
int main()
{
const A a( 55 );
std::cout<< "a value = " << *a.v << std::endl;
A b(a);
std::cout<< "b value = " << *b.v << std::endl;
const A c(11);
std::cout<< "c value = " << *c.v << std::endl;
b = c;
std::cout<< "b new value = " << *b.v << std::endl;
}
Kompiliert einwandfrei mit g ++ 4.6.1 mit:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Der Destruktor für struct A
ist leer und wird nicht wirklich benötigt. Sollte es dort sein oder sollte es entfernt werden?
virtual ~base () = default;
Kompiliert beispielsweise nicht (aus gutem Grund)
auto_ptr
.