2012-07-20 13 views
5

Klasse X -> konvertiert zu Y durch zwei Wege 1) Konstruktoren und 2) durch Umrechnungsfunktionen.
Ich habe verstanden, dass der Konstruktor für einzelne Argumente für die Konvertierung verwendet wird.Konvertierung durch Konstruktoren

In der Beschreibung:

Ein implizit deklarierte Copykonstruktor kein explizites Konstruktor ist; es kann für implizite Typkonvertierung aufgerufen werden.

Frage:

Also, das bedeutet nicht nur einzelne Argument Konstruktor wird für die Umwandlung verwendet, aber auch Konstruktor kopieren ?. Wenn ja, welches Szenario wird verwendet? irgendein Ausschnitt des Beispielcodes?

Bitte ertragen Sie mit mir, wenn die Frage sehr Grundlage ist.

+1

Der Kopierkonstruktor ist ein Konstruktor mit einem Argument. Aber es ändert den Typ nicht, also weiß ich nicht, warum irgendjemand es eine "Umwandlung" nennen würde. –

+1

Ich bin mir ziemlich sicher, dass meine Frau sich aufregt, wenn ich dich "entblöße". :-) –

+0

haha, Jerry, Danke für das Aufzeigen. :) – Whoami

Antwort

1

Implizit deklarierter Kopierkonstruktor kann nicht für Konvertierungen verwendet werden, da es copy-ctor ist, das als T(const T&) oder T(T&) deklariert wurde.

Entwurf n3337 Par 12.8 C++ Standard.

8 Die implizit deklarierte Kopie Konstruktor für eine Klasse X haben die Form X :: X (const X &), wenn - jede direkte oder virtuelle Basisklasse B von X eine Kopie Konstruktor, dessen erste hat Parameter ist vom Typ const B & oder const flüchtige B &, und - für alle nicht statischen Daten Mitglieder von X, die einer Klasse M (oder Array davon) sind, hat jeder dieser Klassen eine Kopie Konstruktor, dessen erste Parameter ist vom Typ const M & oder const flüchtige M & .119 Andernfalls implizit deklarieren d Copykonstruktor das Formular X :: X (X &)

Da Kopie c-tor ist nicht explizit Sie solchen Code

struct So 
{ 
}; 

int main() 
{ 
    So s = So(); 
} 

Wenn copy-ctor explizit verwenden können, ist man nur verwenden könnte Initialisieren wie So s((So()));

+0

Es kann eine Umwandlung von T zu T aus Gründen der Allgemeinheit genannt werden. –

+0

@SergeyK. "kann sein" ist dasselbe wie "ist". Ist das eine Konvertierung oder nicht? – curiousguy

+0

@curiousguy: Überprüfen Sie das .pdf in meiner Antwort –

3

Copy-Konstruktor ist kein expliziter Konstruktor, daher wird es wo immer möglich verwendet. Copy-Konstruktor wird nur vom selben Typ "konvertieren", es ist also keine Konvertierung im vollen Sinne. Aus Gründen der Allgemeinheit ist es jedoch praktisch, es als eins zu bezeichnen.

Lesen Sie dieses Papier: http://www.keithschwarz.com/cs106l/winter20072008/handouts/180_Conversion_Constructors.pdf, wenn Sie weitere Details zu Konvertierungskonstruktoren wünschen.

+0

"_Copy-Konstruktor ist kein expliziter Konstruktor, daher wird er wo immer möglich verwendet. _" Und wo immer es unmöglich ist, wird ein expliziter Konstruktor verwendet. – curiousguy

+0

@curiousguy: also sind sie ziemlich gleich, oder? –

1

Ein impliziter Kopierkonstruktor ist einer, den der Compiler für Sie schreibt. Es hat immer die Form

T(const T&); 

Dies bedeutet, dass jedes Objekt, das einen Umwandlungsoperator zu const T& hat, kann implizit kopiert werden, auch wenn dies nicht das, was Sie wollten. Die häufigste Möglichkeit, dies auszulösen, besteht darin, aus einer abgeleiteten Klasse eine Kopie in eine Basisklasse zu erstellen. Dies wird Objekt-Slicing genannt, da die Kopie nicht den gleichen Typ wie das Original hat und wahrscheinlich einige wichtige Eigenschaften oder Verhaltensweisen verlieren wird.

+3

Nicht immer. 12.8 Par. 8 n3337 Entwurf. – ForEveR

+0

@ForEveR, danke für das Hinzeigen - ich wusste nicht, dass es Ausnahmen gab. Es fällt mir immer noch schwer, mir vorzustellen, was die praktischen Randfälle beim Lesen des Standards sind. –

+1

@Mark: Wenn Ihre Klasse ein 'auto_ptr' enthält (warum würden Sie, da' unique_ptr' hinzugefügt wurde?), Dann wird Ihr implizit generierter "copy constructor" eine Bewegungssemantik haben. –

2

Im Grunde bedeutet es, dass Sie tun können:

struct A {}; 
A a; 
A b = a; 

Wenn der Copykonstruktor wurde explizit gekennzeichnet, dass kompilieren würde scheitern. Sie können es testen, indem Sie der Struktur explicit A(A const &) {} hinzufügen und das Programm neu kompilieren.

+0

Ist das eine Konvertierung? – curiousguy