static_cast in C++ | Geben Sie Casting-Operatoren ein
Ein Cast-Operator ist ein unärer Operator , der die Umwandlung eines Datentyps in einen anderen Datentyp erzwingt.
C++ unterstützt vier Casting-Typen:
1. Statischer Cast
2. Dynamischer Cast
3. Const Cast
4. Reinterpret Cast
Statischer Wurf: Dies ist die einfachste Wurfart, die verwendet werden kann. Es ist ein Cast zur Kompilierzeit . Es führt Dinge wie implizite Konvertierungen zwischen Typen durch (z. B. int zu Float oder Zeiger auf void *) und kann auch explizite Konvertierungsfunktionen (oder implizite) aufrufen.
Für zB
#include <iostream> using namespace std; int main() { float f = 3.5; int a = f; // this is how you do in C int b = static_cast<int>(f); cout << b; }
Ausgabe:
3
Lassen Sie uns nun ein paar Änderungen im Code vornehmen.
#include <iostream> using namespace std; 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; }
Wenn Sie den Code kompilieren, erhalten Sie eine Fehlermeldung:
[Error] invalid static_cast from type 'char*' to type 'int*'
Das bedeutet, dass selbst wenn Sie glauben, Sie könnten ein bestimmtes Objekt in ein anderes typisieren, aber sein illegales , static_cast Ihnen dies nicht erlaubt.
Nehmen wir ein weiteres Beispiel für das Konvertieren von Objekten in und aus einer Klasse.
#include <iostream> #include <string> using namespace std; class Int { int x; public: Int(int x_in = 0) : x{ x_in } { cout << "Conversion Ctor called" << endl; } operator string() { cout << "Conversion Operator" << endl; return to_string(x); } }; int main() { Int obj(3); string str = obj; obj = 20; string str2 = static_cast<string>(obj); obj = static_cast<Int>(30); return 0; }
Führen Sie den obigen Code aus:
Conversion Ctor called Conversion Operator Conversion Ctor called Conversion Operator Conversion Ctor called
Lassen Sie uns versuchen, die obige Ausgabe zu verstehen:
- Wenn obj erstellt wird, wird der Konstruktor aufgerufen, der in unserem Fall auch ein Konvertierungskonstruktor ist (für C++ 14-Regeln werden Bits geändert).
- Wenn Sie str aus obj erstellen, gibt der Compiler keinen Fehler aus, da wir den Conversion-Operator definiert haben.
- Wenn Sie make
obj=20
aufrufen, rufen Sie tatsächlich den Konvertierungskonstruktor auf. - Wenn Sie str2 aus static_cast machen , ist es ziemlich ähnlich zu
string str=obj;
, aber mit einer strengen Typprüfung. - Wenn Sie schreiben
obj=static_cast<Int>(30)
, konvertieren Sie 30 mit static_cast in Int .
Nehmen wir ein Beispiel, bei dem es um Vererbung geht.
#include <iostream> using namespace std; class Base { }; class Derived : public Base { }; int main() { Derived d1; Base* b1 = (Base*)(&d1); // allowed Base* b2 = static_cast<Base*>(&d1); return 0; }
Der obige Code wird ohne Fehler kompiliert.
- Wir haben die Adresse von übernommen
d1
und explizit in gegossen und inBase
gespeichertb1
. - Wir haben die Adresse von
d1
genommen und static_cast verwendet, um sie in umzuwandeln,Base
und sie in gespeichertb2
.
Wie wir wissen, führt static_cast eine strenge Typprüfung durch, lassen Sie uns den geänderten Code leicht sehen, um ihn zu sehen:
#include <iostream> using namespace std; class Base { }; class Derived : private Base { // Inherited private/protected not public }; int main() { Derived d1; Base* b1 = (Base*)(&d1); // allowed Base* b2 = static_cast<Base*>(&d1); return 0; }
Versuchen Sie, den obigen Code zu kompilieren. Was sehen Sie? Kompilierungsfehler!!!!!!
[Error] 'Base' is an inaccessible base of 'Derived'
Der obige Code wird nicht kompiliert, selbst wenn Sie als geschützt erben . Um also static_cast zu verwenden, erben Sie es als öffentlich.
Verwenden Sie static_cast, um den 'to and from'-void-Zeiger umzuwandeln.
#include <iostream> int main() { int i = 10; void* v = static_cast<void*>(&i); int* ip = static_cast<int*>(v); return 0; }