A regra 3 ( a regra 5 no novo padrão c ++) declara:
Se você precisar declarar explicitamente o destruidor, o construtor de cópias ou o operador de atribuição de cópias, provavelmente precisará declarar explicitamente todos os três.
Mas, por outro lado, o " Código Limpo " de Martin recomenda remover todos os construtores e destruidores vazios (página 293, G12: Desordem ):
De que uso é um construtor padrão sem implementação? Tudo o que serve é desordenar o código com artefatos sem sentido.
Então, como lidar com essas duas opiniões opostas? Os construtores / destruidores vazios devem realmente ser implementados?
O próximo exemplo demonstra exatamente o que quero dizer:
#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;
}
Compila bem usando g ++ 4.6.1 com:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
O destruidor de struct A
está vazio e não é realmente necessário. Então, deveria estar lá ou deveria ser removido?
virtual ~base () = default;
não compila (com uma boa razão)
auto_ptr
.