Default-Konstruktor/Destruktor von außerhalb der Klasse?
Ist folgende rechtliche nach dem standard C++11 (= default
außerhalb der definition der Klasse) ?
//In header file
class Test
{
public:
Test();
~Test();
};
//In cpp file
Test::Test() = default;
Test::~Test() = default;
- Das ist in Ordnung, der standard selbst verwendet es in einem Beispiel (
§8.4.2/3
).= default
und= delete
sind nur "normale" Funktion stellen (wie pro-spec sowieso), also das, was du schreiben würdest, in eine definition. - Beachten Sie, dass eine VORGEGEBENE definition kann angezeigt werden, nachdem die erste Deklaration der Funktion, während eine gelöschte definition muss die erste Deklaration der Funktion.
- Klingt wie eine Antwort.
- Beachten Sie, dass ein Konstruktor, der Verzug ist auf diese Weise, wird noch eine vom Benutzer bereitgestellte Konstruktor. Als Ergebnis, Ihrer Klasse
Test
ist nicht eine triviale Klasse. Siehe stackoverflow.com/a/7169675/396551
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, eine spezielle member-Funktion kann der Standard-definierten out-of-line-in ein .cpp-Datei. Klar, dass damit einige der Eigenschaften eines inline-ausgefallen-Funktion wird nicht für Ihre Klasse. Zum Beispiel, wenn Ihr copy-Konstruktor default-definierten out-of-line, Ihre Klasse wird nicht als trivial kopierbaren (die auch disqualifiziert, es wird erkannt als POD). Ebenso kann ein Standard-definierten out-of-line-Destruktor werden, disqualifizieren Sie Ihre Art von trivial (oder POD).
Dies kann nützlich sein, wenn Sie wollen, haben eine nicht-inline-copy-Konstruktor und Steuern, wo es definiert ist (vielleicht, um die Kontrolle über generierten template-Definitionen wird es erfordern), aber nicht wollen, um manuell zu definieren Sie selbst mit einem handgefertigten member-Initialisierungsliste, die wäre aufwendig und könnte go stale unter Wartung.