Initialisierung von Array-Objekten, deren Klasse ein ctor / dtor hat

8

Ich möchte Array-Objekte initialisieren, indem ich die Initialisierungsanweisung wie folgt benutze.

%Vor%

Laut einem autoritativen Buch wie ARM (mit Anmerkungen versehenes Referenzhandbuch) für C ++ scheint es so zu sein, dass dies die Art und Weise ist, das Objekt-Array zu initialisieren, das Konstruktor / Destruktor hat. Im Anschluss habe ich den folgenden Beispielcode erstellt und sehe, was passiert.

%Vor%

Wie beim ersten Versuch, den obigen Quellcode mit GNU GCC (4.1.2) zu kompilieren, ist es fehlgeschlagen, etwas wie das Folgende zu erzeugen.

%Vor%

Also habe ich verstanden, dass dies bedeutet, dass, um die Initialisierung von Objekt-Arrays zu ermöglichen, 'copy constructor' benötigt wird. Dann habe ich versucht, den obigen Code zu kompilieren, indem ich einen benutzerdefinierten (öffentlichen) Kopierkonstruktor wie folgt einführte:

%Vor%

Ich konnte den Quellcode erfolgreich kompilieren. Wenn ich jedoch das Programm ausführe, das wie oben beschrieben erstellt wurde, habe ich folgende Ausgabe erhalten.

%Vor%

Was ich wissen möchte, ist folgendes,

  1. Warum können wir den Kopierkonstruktor nicht als privat deklarieren?

  2. Warum der benutzerdefinierte Kopierkonstruktor nicht aufgerufen wird (ich hatte erwartet, dass die Ausgabe "Copy Ctor: xxxx" irgendwo enthalten hätte. Aber ich konnte das nicht verstehen. Also habe ich den benutzerdefinierten Kopierkonstruktor verstanden wurde nicht aufgerufen.)

Eigentlich bin ich nicht wirklich sicher, ob das Obige spezifisch für GNU GCC ist oder das ist C ++ - Sprachspezifikation ... Es wäre zu begrüßen, wenn einige von euch mir den richtigen Zeiger auf das obige geben könnten.

    
Smg 30.05.2011, 13:21
quelle

2 Antworten

3

Ob der Kopierkonstruktor nicht vom Compiler verwendet wird, muss zugänglich sein - d. h. er darf nicht privat sein. In diesem Fall könnte der Compiler den Kopierkonstruktor vermeiden, indem er den const char * -Konstruktor direkt verwendet, aber trotzdem einen barrierefreien copy ctor benötigt. Dies ist eine Sache, die nicht im ARM behandelt wird, was veraltet ist.

    
Neil Butterworth 30.05.2011, 13:25
quelle
4

Der Compiler elimiert die Kopie, aber der Copy-Konstruktor muss immer noch zugänglich sein.

    
Björn Pollex 30.05.2011 13:23
quelle