2013-01-10 17 views
11

Czy zgodnie z normą C++ 11 (= default) jest niezgodny z definicją klasy?Domyślny konstruktor/destruktor poza klasą?

// In header file 
class Test 
{ 
    public: 
     Test(); 
     ~Test(); 
}; 

// In cpp file 
Test::Test() = default; 
Test::~Test() = default; 
+8

To jest w porządku, standard używa go nawet w przykładzie ("§8.4.2/3"). '= default' i' = delete' są po prostu "normalnymi" ciałami funkcyjnymi (w każdym razie według specyfikacji), tj. co napiszesz w * definicji *. – Xeo

+2

Należy zauważyć, że domyślna definicja może pojawić się po pierwszej deklaracji funkcji, podczas gdy usunięta definicja musi być pierwszą deklaracją funkcji. – MWid

+0

@Xeo Brzmi jak odpowiedź. –

Odpowiedz

8

Tak, specjalna funkcja składowa może być domyślnie zdefiniowana poza linią w pliku .cpp. Uświadom sobie, że niektóre właściwości funkcji wbudowanej domyślnie nie będą miały zastosowania do twojej klasy. Na przykład, jeśli twój konstruktor kopiowania jest domyślnie zdefiniowany poza linią, twoja klasa nie będzie uważana za trywialnie kopiowalną (co również dyskwalifikuje to, że nie zostanie rozpoznany jako POD). Podobnie, domyślny destruktor typu out-of-line zdyskwalifikuje twój typ z bycia trywialnym (lub POD).

Może to być użyteczne, jeśli chcesz mieć wbudowany konstruktor kopii i kontrolę nad tym, gdzie jest on zdefiniowany (być może w celu przejęcia kontroli nad wygenerowanymi definicjami szablonów będzie to konieczne), ale nie chcesz go ręcznie definiować się z ręcznie spreparowaną listą inicjalizującą członków, która byłaby pracochłonna i mogłaby przestać działać w ramach konserwacji.

Powiązane problemy