Heim  >  Artikel  >  Backend-Entwicklung  >  So konvertieren Sie C++-Typen

So konvertieren Sie C++-Typen

醉折花枝作酒筹
醉折花枝作酒筹Original
2021-06-28 14:54:502680Durchsuche

Methoden: 1. static_cast, wird für die Konvertierung nicht polymorpher Typen verwendet; 2. reinterpret_cast, wird in einen anderen nicht verwandten Typ konvertiert; 3. const_cast, löscht das const-Attribut der Variablen und weist es dann zu. 4. Dynamic_cast, wird für Klassen verwendet Zeiger- oder Referenzkonvertierung zwischen Vererbungsebenen.

So konvertieren Sie C++-Typen

Die Betriebsumgebung dieses Tutorials: Windows 7-System, C++17-Version, Dell G3-Computer.

So konvertieren Sie C++-Typen

Um die Typkonvertierung in C zu standardisieren und die Sichtbarkeit der Typkonvertierung zu verbessern, führt C++ vier erzwungene Typkonvertierungsoperatoren ein: static_cast, reinterpret_cast, const_cast, Dynamic_cast

Sie sind im Wesentlichen Vorlagenklassen.

Das Folgende wird separat eingeführt:

1.static_cast

Es wird für die Konvertierung nicht polymorpher Typen (statische Konvertierung) verwendet. entspricht der impliziten Typkonvertierung in C, kann jedoch nicht für beide verwendet werden Konvertierung nicht verwandter Typen, z. B. Konvertierung zwischen Ganzzahl und Ganzzahlzeiger. Obwohl es sich bei beiden um vier Bytes handelt, stellt einer Daten und der andere eine Adresse dar. Die Typen sind irrelevant und können nicht konvertiert werden.

Diese Konvertierung wird zur Kompilierungszeit abgeschlossen, ähnlich der Typkonvertierung im C-Stil, aber bitte beachten Sie die folgenden Punkte:

Kann nicht zwischen zwei Klassentypen konvertiert werden, die keine Ableitungsbeziehung haben.

Der Typmodifikator des ursprünglichen Typs kann nicht entfernt werden , wie const, volatile, __unaligned

Da beim Konvertieren von Objekten keine dynamische Typprüfung erfolgt, bestehen Sicherheitsrisiken beim Konvertieren von Basisklassenobjekten in abgeleitete Klassenobjekte

void Test()
{
    //C中的方式
    int i = 10;
    double d1 = i;//隐式类型转换
    //int *p = i;//无法隐式类型转换,只能强制类型转换
    int *p = (int*)i;
    //C++中的方式
    double d2 = static_cast<double>(i);
    //相当于创建一个static_cast<double>类型的匿名对象赋值给d2
    int* p2 = static_cast<int*>(i);//无法转换,会报错
}

So konvertieren Sie C++-Typen

2.reinterpret_cast

Die Bedeutung von reinterpret Die Neuinterpretation kann einen Typ in einen anderen, nicht verwandten Typ konvertieren,

entspricht der erzwungenen Typkonvertierung in C und behandelt Situationen, in denen eine implizite Konvertierung nicht durchgeführt werden kann

void Test()
{
    int i = 10;
    int* p2 = reinterpret_cast<int*>(i);
}

Erzwungene Typkonvertierung kann manchmal heftige Probleme lösen

Das folgende Beispiel:

Wie kann eine Funktion mit Parametern ohne Übergabe von Parametern aufgerufen werden?

void Fun(int s)
{
    cout << s << endl;
}
typedef void(*FUNC)();
void Test()
{
    FUNC pf = reinterpret_cast<FUNC>(Fun);
    pf();
}

Casting in C wird ebenfalls übernommen.

Obwohl wir Funktionszeiger mit dieser BUG-Methode konvertieren, ist dieser Code nicht portierbar und führt manchmal zu unsicheren Ergebnissen. Daher wird die Verwendung auf diese Weise nicht empfohlen.

Der hier ausgegebene Wert von s ist jedoch ein Zufallswert Wenn der Benutzer keine externen Parameter übergibt, erstellt die Funktion beim Aufruf einen formalen Parameter. Der formale Parameter ist natürlich ein Zufallswert. Das const-Attribut der Variablen eignet sich für die Neuzuweisung wird zur Kompilierzeit abgeschlossen und dient zum Entfernen der const- und volatile-Modifikatoren. Es kann nur Zeiger oder Referenzen konvertieren. Dynamic_cast wird hauptsächlich für „sicheres Abwärtscasting“ verwendet Referenzkonvertierung zwischen Klassenvererbungshierarchien. Es wird hauptsächlich zur Durchführung eines „sicheren Downcasting“ verwendet, d. h. zum Konvertieren von Zeigern oder Referenzen von Basisklassenobjekten in andere Zeiger oder Referenzen derselben Vererbungsebene.

Die „erste Konvertierung“ (d. h. der abgeleitete Klassenzeiger oder Referenztyp wird in seinen Basisklassentyp konvertiert) ist zwar an sich sicher, dies ist jedoch nicht erforderlich Die Konvertierung kann bereits erreicht werden. Schließlich erfordert die Verwendung von Dynamic_cast einen Overhead. So konvertieren Sie C++-Typen

void Test3()
{
    const int i = 10;
    int *p = const_cast<int*>(&i);
    *p = 20;
    cout << i << endl;
    cout << *p << endl;
}

Empfohlenes Tutorial: „

C#

Das obige ist der detaillierte Inhalt vonSo konvertieren Sie C++-Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn