Benutzerdefinierte Conversions in C ++

8

Vor kurzem habe ich meine Kopie von der C ++ Pocket Reference von O'Reilly Media gelesen und war überrascht, als ich auf einen kurzen Abschnitt und ein Beispiel bezüglich der benutzerdefinierten Konvertierung für Benutzer stieß. Definierte Typen:

%Vor%

Ich habe schon eine Weile in C ++ programmiert, und das ist das erste Mal, dass ich diese Art von Überlastung von Operatoren gesehen habe. Die Beschreibung des Buches zu diesem Thema ist etwas kurz und lässt mich mit einigen unbeantworteten Fragen zu diesem Feature zurück:

  • Ist das ein besonders obskures Merkmal? Wie gesagt, ich programmiere seit einiger Zeit in C ++ und das ist das erste Mal, dass ich darauf stoße. Ich hatte nicht viel Glück, diesbezüglich mehr ausführliches Material zu finden.
  • Ist das relativ portabel? (Ich kompiliere auf GCC 4.1)
  • Können benutzerdefinierte Konvertierungen zu benutzerdefinierten Typen durchgeführt werden? z.B.

    operator std :: string () {/ * code * /}

wash 09.06.2010, 18:25
quelle

4 Antworten

12
  

Ist das ein besonders obskures Merkmal?

Ja, Konvertierungsoperatoren werden nicht oft verwendet. Die Orte, die ich gesehen habe, sind für benutzerdefinierte Typen, die zu integrierten Typen degradieren können. Dinge wie eine Zahlenklasse mit fester Genauigkeit, die die Konvertierung von Atomartentypen unterstützt.

  

Ist das relativ portabel?

Soweit ich weiß, ist es das. Sie waren für immer im Standard.

  

Können benutzerdefinierte Konvertierungen zu benutzerdefinierten Typen durchgeführt werden?

Ja, das ist eine der Eigenschaften von Konstruktoren. Ein Konstruktor, der ein einzelnes Argument verwendet, erstellt effektiv einen Konvertierungsoperator vom Argumenttyp in den Typ Ihrer Klasse. Zum Beispiel eine Klasse wie diese:

%Vor%

Lass es uns tun:

%Vor%

Wenn Sie std::string bereits vorher verwendet haben, haben Sie wahrscheinlich diese Funktion genutzt, ohne es zu merken. (Wenn Sie verhindern dieses Verhalten verhindern möchten, deklarieren Sie alle Konstruktoren mit nur einem Argument mit explicit .)

    
munificent 09.06.2010, 18:30
quelle
4

Es war eines der ersten Dinge, über die ich gestolpert bin, als ich C ++ gelernt habe, also würde ich sagen, nein, es ist nicht ganz so unklar.

Eine Sache, vor der ich allerdings warnen würde: Verwenden Sie das explicit -Schlüsselwort, wenn Sie nicht genau wissen, was Sie tun. Implizite Conversions können dazu führen, dass sich Code unerwartet verhält. Daher sollten Sie die Verwendung in den meisten Fällen vermeiden. Ehrlich gesagt, ich wäre glücklicher, wenn die Sprache sie nicht hätte.

    
T.E.D. 09.06.2010 18:32
quelle
4

Es ist nicht besonders unklar; es ist sehr portabel (es ist immerhin ein Teil der Sprache) und die Konvertierung in benutzerdefinierte Typen ist möglich.

Ein Wort der Vorsicht, mit vielen möglichen impliziten Umwandlungspfaden kann dazu führen, dass unerwartete Konvertierungen aufgerufen werden und überraschende Fehler auftreten. Auch das Konvertieren nichtkonvertierender Konstruktoren und Konvertierungsfunktionen zwischen mehreren benutzerdefinierten Typen kann zu mehrdeutigen Konvertierungssequenzen führen, die sich nur schwer auflösen lassen.

    
Charles Bailey 09.06.2010 18:30
quelle
3

Dies ist ein besonders nützliches Standard-C ++ - Feature und nicht ein bisschen obskur :) Sie können grundlegende und benutzerdefinierte Typen gleichermaßen für Konvertierungsoperatoren verwenden.

    
humbagumba 09.06.2010 18:30
quelle

Tags und Links