beachte Folgendes:
%Vor%Dieser Code erzeugt diese Ausgabe:
%Vor% Ich dachte, dass alle oben genannten drei Aussagen äquivalent sind, da der CTOR niemals kopiert wird. Ändern Sie jedoch X
's kopieren CTOR, um privat zu sein:
Fehler beim Kompilieren (In Visual Studio 2010) mit diesem Fehler:
%Vor%So scheint es, die Kopie CTOR ist irgendwie beteiligt, obwohl ich nicht ganz verstehe, wie.
Danke
Der Grund ist, dass all diese nicht genau gleichwertig sind.
Die erste ist direkte Initialisierung , während die zweite und dritte Kopierinitialisierung ist. Für die Copy-Initialisierung muss copy-constructor öffentlich sein, andernfalls gibt der Compiler einen Fehler.
Nun ist die Frage, ob 2. und 3. benötigt, dass der copy-ctor public ist, warum dann die folgende Ausgabe:
%Vor%Das sagt sicher, dass copy-ctor niemals aufgerufen wird, was wahr ist. Der Compiler hat gerade den Aufruf von copy-ctor abgelehnt. Gemäß §8.5 / 14 darf der Compiler in solchen Fällen die Notwendigkeit des Aufrufs des Copy-Konstruktors beseitigen. Deshalb wird copy-ctor nicht aufgerufen.
Etwas innerlich: Im zweiten und dritten Fall wird zuerst ein temporäres Objekt erstellt, indem X(int i)
aufgerufen wird. Dieses temporäre Objekt sollte dann an den copy-ctor übergeben werden, um das deklarierte Objekt zu initialisieren. Aber der Compiler optimiert diesen Schritt und trennt den Aufruf von copy-ctor.
Das X x2 = ...
ruft den Kopierkonstruktor auf (auch wenn der Compiler es später optimiert). Daher muss es immer noch zugänglich sein.
Ist-Objekt verwendet parrametrisierten Konstruktor, wie Sie es kennen, und alle anderen verwenden Kopierkonstruktor. Das heißt, wenn Sie es machen, tritt eine private Zugriffsverletzung auf. Die anderen beiden Objekte verwenden den Kopierkonstruktor.
Dies ist die Art der Verwendung des Kopierkonstruktors.
Tags und Links c++ copy-constructor access-modifiers