Ein Cast-Operator ist ein unärer Operator Dadurch wird die Konvertierung eines Datentyps in einen anderen Datentyp erzwungen.
C++ unterstützt vier Casting-Typen:
- Statische Besetzung
- Dynamische Besetzung
- Const-Besetzung
- Besetzung neu interpretieren
Dieser Artikel konzentriert sich auf die detaillierte Erörterung von static_cast.
Statische Besetzung
Dies ist die einfachste Art der Besetzung, die verwendet werden kann. es ist ein Besetzung zur Kompilierungszeit . Es führt beispielsweise implizite Konvertierungen zwischen Typen durch (z. B. int in float oder Zeiger auf void*) und kann auch explizite Konvertierungsfunktionen aufrufen.
Syntax von static_cast
static_cast < dest_type>(Quelle);>
Der Rückgabewert von static_cast ist of Zieltyp.
Beispiel für static_cast
Nachfolgend finden Sie das C++-Programm zur Implementierung von static_cast:
C++
// C++ Program to demonstrate> // static_cast> #include> using> namespace> std;> // Driver code> int> main()> {> >float> f = 3.5;> >// Implicit type case> >// float to int> >int> a = f;> >cout <<>'The Value of a: '> << a;> >// using static_cast for float to int> >int> b =>static_cast><>int>>(f);> >cout <<>'
The Value of b: '> << b;> }> |
>
>Ausgabe
The Value of a: 3 The Value of b: 3>
Das Verhalten von static_cast für verschiedene Szenarien
1. static_cast für Zeiger auf primitive Datentypen:
Nehmen wir nun ein paar Änderungen am obigen Code vor.
c-formatierte Zeichenfolge
C++
// C++ Program to demonstrate> // static_cast char* to int*> #include> using> namespace> std;> // Driver code> int> main()> {> >int> a = 10;> >char> c =>'a'>;> > >// Pass at compile time,> >// may fail at run time> >int>* q = (>int>*)&c;> >int>* p =>static_cast><>int>*>(&c);> >return> 0;> }> |
>
>
Ausgabe
error: invalid 'static_cast' from type 'int*' to type 'char*'>
Erläuterung: Das heißt, selbst wenn Sie denken, Sie könnten einen bestimmten Objektzeiger irgendwie in einen anderen umwandeln, dies aber illegal ist, erlaubt Ihnen static_cast dies nicht.
2. Konvertieren eines Objekts mithilfe eines benutzerdefinierten Konvertierungsoperators
static_cast kann den Konvertierungsoperator der Klasse aufrufen, sofern dieser definiert ist. Nehmen wir ein weiteres Beispiel für die Konvertierung eines Objekts in und aus einer Klasse.
Beispiel:
C++
// C++ Program to cast> // class object to string> // object> #include> #include> using> namespace> std;> // new class> class> integer {> >int> x;> public>:> >// constructor> >integer(>int> x_in = 0)> >: x{ x_in }> >{> >cout <<>'Constructor Called'> << endl;> >}> >// user defined conversion operator to string type> >operator string()> >{> >cout <<>'Conversion Operator Called'> << endl;> >return> to_string(x);> >}> };> // Driver code> int> main()> {> >integer obj(3);> >string str = obj;> >obj = 20;> >// using static_cast for typecasting> >string str2 =>static_cast>(obj);> >obj =>static_cast>(30);> >return> 0;> }> |
>
>Ausgabe
Constructor Called Conversion Operator Called Constructor Called Conversion Operator Called Constructor Called>
Erläuterung: Versuchen wir, die obige Ausgabe Zeile für Zeile zu verstehen:
- Wann obj erstellt wird, wird dann der Konstruktor aufgerufen, der in unserem Fall auch ein Konvertierungskonstruktor ist (für C++14 werden die Regeln etwas geändert).
- Wenn du erschaffst str aus obj , gibt der Compiler keinen Fehler aus, da wir den Konvertierungsoperator definiert haben.
- Wenn du machst obj = 20 , rufen Sie tatsächlich den Konvertierungskonstruktor auf.
- Wenn du machst str2 aus static_cast , es ist dem String ziemlich ähnlich str = obj ; aber mit strenger Typprüfung.
- Wenn du schreibst obj = static_cast (30) , Sie wandeln 30 in ein um ganze Zahl mit static_cast.
3. static_cast für Vererbung in C++
static_cast kann im Falle einer Vererbung sowohl Upcasting als auch Downcasting bereitstellen. Das folgende Beispiel demonstriert die Verwendung von static_cast im Fall von Upcasting.
Beispiel:
C++
// C++ Program to demonstrate> // static_cast in inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived :>public> Base> {};> // Driver code> int> main()> {> >Derived d1;> > >// Implicit cast allowed> >Base* b1 = (Base*)(&d1);> > >// upcasting using static_cast> >Base* b2 =>static_cast>(&d1);> >return> 0;> }> |
>
>
Erläuterung: Der obige Code wird ohne Fehler kompiliert.
- Wir haben die Adresse von d1 genommen und sie explizit in Base umgewandelt und in b1 gespeichert.
- Wir haben die Adresse von d1 genommen und mit static_cast sie in Base umgewandelt und in b2 gespeichert.
Im obigen Beispiel haben wir die Basisklasse als öffentlich geerbt. Was passiert, wenn wir es als privat erben? Das folgende Beispiel zeigt Folgendes:
Beispiel:
C++
Java-Tostring-Methode
// C++ program to demonstrate> // static_cast in case of> // private inheritance> #include> using> namespace> std;> class> Base> {};> class> Derived:>private> Base> {> >// Inherited private/protected> >// not public> };> // Driver code> int> main()> {> >Derived d1;> > >// Implicit type cast allowed> >Base* b1 = (Base*)(&d1);> > >// static_cast not allowed> >Base* b2 =>static_cast>(&d1);> >return> 0;> }> |
>
>
Fehler bei der Kompilierung:
[Error] 'Base' is an inaccessible base of 'Derived'>
Erläuterung: Der obige Code wird nicht kompilieren auch wenn Sie es als erben geschützt .
Um static_cast im Falle einer Vererbung verwenden zu können, muss die Basisklasse zugänglich, nicht virtuell und eindeutig sein.
4. static_cast, um den Void-Zeiger „zu und von“ umzuwandeln
Der static_cast-Operator ermöglicht die Umwandlung von jedem Zeigertyp in einen ungültigen Zeiger und umgekehrt.
Beispiel:
C++
// C++ program to demonstrate> // static_cast to cast 'to and> // from' the void pointer> #include> using> namespace> std;> // Driver code> int> main()> {> >int> i = 10;> >void>* v =>static_cast><>void>*>(&i);> >int>* ip =>static_cast><>int>*>(v);> >cout << *ip;> >return> 0;> }> |
>
>Ausgabe
10>