Правило 3 ( правило 5 у новому стандарті c ++) передбачає:
Якщо вам потрібно чітко оголосити або деструктора, конструктора копіювання або оператора призначення копії самостійно, вам, ймовірно, потрібно чітко заявити про всі три з них.
Але, з іншого боку, " чистий код " Мартіна радить видалити всі порожні конструктори та деструктори (стор. 293, G12: Захват ):
З чого використовують конструктор за замовчуванням без реалізації? Все, що вона служить, - це захаращувати код безглуздими артефактами.
Отже, як поводитися з цими двома протилежними думками? Чи слід реально реалізувати порожні конструктори / деструктори?
Наступний приклад демонструє саме те, що я маю на увазі:
#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;
}
Добре компілює, використовуючи g ++ 4.6.1 з:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Деструктор для struct A
порожнього не потрібен. Отже, чи має воно бути там, чи його слід зняти?
virtual ~base () = default;
не компілюється (з поважної причини)
auto_ptr
жодне.