Aturan 3 ( aturan 5 dalam standar c ++ baru) menyatakan:
Jika Anda perlu secara eksplisit mendeklarasikan baik destruktor, copy constructor atau operator penugasan sendiri, Anda mungkin perlu secara eksplisit mendeklarasikan ketiganya.
Tetapi, di sisi lain, " Kode Bersih " Martin menyarankan untuk menghapus semua konstruktor dan penghancur kosong (halaman 293, G12: Berantakan ):
Apa gunanya konstruktor default tanpa implementasi? Yang harus dilakukan hanyalah mengacaukan kode dengan artefak yang tidak berarti.
Jadi, bagaimana menangani dua pendapat yang berlawanan ini? Haruskah konstruktor / penghancur kosong benar-benar dilaksanakan?
Contoh berikutnya menunjukkan dengan tepat apa yang saya maksud:
#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;
}
Kompilasi denda menggunakan g ++ 4.6.1 dengan:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Destructor untuk struct A
kosong, dan tidak benar-benar diperlukan. Jadi, haruskah ada di sana, atau haruskah dihapus?
virtual ~base () = default;
jangan mengompilasi (dengan alasan yang bagus)
auto_ptr
keduanya.