C ++: Ist der Standardkopiekonstruktor von anderen Konstruktoren und Destruktoren betroffen?

8

Wie wir wissen , wenn Jeder Konstruktor wird deklariert (Kopierkonstruktor eingeschlossen). Der Standardkonstruktor (der keine Argumente annimmt) wird nicht implizit erstellt. Gilt das auch für einen Standardkopiekonstruktor (den, der eine flache Kopie eines Objekts ausführt)? Beeinflusst das Vorhandensein von Destruktoren das auch?

    
Septagram 11.04.2011, 09:28
quelle

5 Antworten

5

Die Antworten hier sind korrekt, aber nicht vollständig. Sie sind korrekt für C ++ 98 und C ++ 03. In C ++ 11 erhalten Sie keinen Kopierkonstruktor, wenn Sie einen Move-Konstruktor oder einen Move-Zuweisungsoperator deklariert haben. Wenn Sie einen Kopierzuweisungsoperator oder einen Destruktor deklariert haben, ist die implizite Generierung des Kopierkonstruktors veraltet. 12.8 [class.copy]:

  

Wenn die Klassendefinition dies nicht tut   explizit einen Kopierkonstruktor deklarieren,   Es gibt keine vom Benutzer deklarierte Bewegung   Konstruktor, und es gibt keine   Benutzer-deklarierte Bewegungszuweisung   Operator, ein Kopierkonstruktor ist   implizit als voreingestellt deklariert   (8.4.2). Eine solche implizite Deklaration   ist veraltet, wenn die Klasse a hat   Vom Benutzer deklarierter Kopierzuweisungsoperator   oder ein vom Benutzer deklarierter Destruktor.

    
Howard Hinnant 11.04.2011, 15:21
quelle
9

12.8 # 4 Klassenobjekte kopieren

  

Wenn die Klassendefinition dies nicht tut   explizit einen Kopierkonstruktor deklarieren,   man wird implizit deklariert

Und der Destruktor spielt keine Rolle

    
dubnde 11.04.2011 09:44
quelle
3

Nein. Sie erhalten einen Standardkopiekonstruktor, wenn Sie keinen eigenen Kopierkonstruktor angeben und das Vorhandensein oder Fehlen eines Destruktors keinen Unterschied macht.

    
Gareth McCaughan 11.04.2011 09:31
quelle
3

Nein. Und beachte das

%Vor%

stellt keinen Kopierkonstruktor zur Verfügung, und es wird ein Standardkonstruktor generiert.

    
Alexandre C. 11.04.2011 09:36
quelle
1

Der Standard-Kopierkonstruktor wird immer erstellt, sofern Sie keinen eigenen definieren. Der Konstruktor ohne Argumente ist nicht mit einem anderen Konstruktor vorhanden, um zu vermeiden, dass er aufgerufen wird und daher den Code des realen Konstruktors überspringt.

    
Mario 11.04.2011 09:34
quelle