Frage

Eine Frage im Zusammenhang mit Stammbesetzung vs.static_cast vs.dynamischer_cast:

Welchen Cast-Syntaxstil bevorzugen Sie in C++?

  • Cast-Syntax im C-Stil: (int)foo
  • Cast-Syntax im C++-Stil: static_cast<int>(foo)
  • Konstruktorsyntax: int(foo)

Sie lassen sich möglicherweise nicht in genau die gleichen Anweisungen übersetzen (oder?), aber ihre Wirkung sollte die gleiche sein (richtig?).

Wenn Sie nur zwischen den integrierten numerischen Typen umwandeln, finde ich die Umwandlungssyntax im C++-Stil zu ausführlich.Als ehemaliger Java-Programmierer verwende ich stattdessen eher die Cast-Syntax im C-Stil, aber mein lokaler C++-Guru besteht darauf, die Konstruktor-Syntax zu verwenden.

Was denken Sie?

War es hilfreich?

Lösung

Es ist eine bewährte Methode niemals aus drei Hauptgründen C-artige Umwandlungen zu verwenden:

  • Wie bereits erwähnt erfolgt hier keine Prüfung.Der Programmierer kann einfach nicht wissen, welche der verschiedenen Umwandlungen verwendet wird, was die starke Typisierung schwächt
  • Die neuen Besetzungen sind bewusst optisch auffällig.Da Casts oft eine Schwachstelle im Code aufdecken, wird argumentiert, dass es eine gute Sache ist, Casts im Code sichtbar zu machen.
  • Dies gilt insbesondere dann, wenn mit einem automatisierten Tool nach Abgüssen gesucht wird.Es ist nahezu unmöglich, zuverlässige Abgüsse im C-Stil zu finden.

Wie palm3D bemerkte:

Ich finde die Cast-Syntax im C++-Stil zu ausführlich.

Dies ist aus den oben genannten Gründen beabsichtigt.

Die Konstruktorsyntax (offizieller Name:Funktionsstil-Cast) ist semantisch das gleiche wie die Umwandlung im C-Stil und sollte aus den gleichen Gründen ebenfalls vermieden werden (mit Ausnahme von Variableninitialisierungen bei der Deklaration).Es ist fraglich, ob dies auch für Typen gelten sollte, die benutzerdefinierte Konstruktoren definieren, aber in Effective C++ argumentiert Meyers, dass Sie selbst in diesen Fällen davon absehen sollten, sie zu verwenden.Um zu veranschaulichen:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

Der static_cast Hier wird tatsächlich das aufgerufen auto_ptr Konstrukteur.

Andere Tipps

Entsprechend Stroustrup:

Die "New-Style-Casts" wurden eingeführt um Programmierern die Möglichkeit zu geben, ihre Absichten klarer und den Compiler, um mehr Fehler abzufangen.

Es dient also wirklich der Sicherheit, da es zusätzliche Überprüfungen zur Kompilierungszeit durchführt.

Zu diesem Thema folge ich den Empfehlungen von Scott Meyers (Effektiveres C++, Punkt 2 :Bevorzugen Sie Umwandlungen im C++-Stil.

Ich stimme zu, dass Besetzungen im C++-Stil ausführlich sind, aber das gefällt mir an ihnen:Sie sind sehr leicht zu erkennen und erleichtern das Lesen des Codes (was wichtiger ist als das Schreiben).

Sie zwingen Sie auch dazu, darüber nachzudenken, welche Art von Besetzung Sie benötigen, und die richtige auszuwählen, wodurch das Risiko von Fehlern verringert wird.Sie helfen Ihnen auch dabei, Fehler zur Kompilierungszeit statt zur Laufzeit zu erkennen.

Ich verwende static_cast aus zwei Gründen.

  1. Es ist eindeutig klar, was geschieht.Ich kann das nicht durchlesen, ohne zu merken, dass da eine Besetzung im Gange ist.Bei C-Style-Abwürfen kann Ihr Blick ohne Pause darüber hinweggehen.
  2. Es ist einfach, nach jeder Stelle in meinem Code zu suchen, an der ich ein Casting durchführe.

Auf jeden Fall im C++-Stil.Durch die zusätzliche Eingabe wird verhindert, dass Sie einen Casting durchführen, wenn Sie dies nicht tun sollten :-)

Cast-Syntax im C-Stil, keine Fehlerprüfung durchführen.Cast-Syntax im C++-Stil, führt einige Überprüfungen durch.Wenn Sie static_cast verwenden, wissen Sie zumindest, dass Sie hier vorsichtig sein sollten, auch wenn keine Überprüfung durchgeführt wird.

Die Besetzung im C-Stil ist der schlechteste Weg.Es ist schwerer zu erkennen, nicht zu erfassen, vereint verschiedene Aktionen, die nicht zusammengeführt werden sollten, und kann nicht alles tun, was Casts im C++-Stil können.Sie hätten wirklich C-artige Umwandlungen aus der Sprache entfernen sollen.

Wir verwenden derzeit überall Casts im C-Stil.Ich habe den anderen gefragt Casting-Frage, und ich sehe jetzt den Vorteil, stattdessen static_cast zu verwenden, schon allein deshalb, weil es „greppable“ ist (ich mag diesen Begriff).Ich werde wahrscheinlich damit anfangen.

Ich mag den C++-Stil nicht.es sieht zu sehr nach einem Funktionsaufruf aus.

Entscheiden Sie sich für den C++-Stil, und noch schlimmer: Die hässlichen, ausführlichen Codeschnipsel, aus denen die explizite Typumwandlung von C++ bestand, werden Sie ständig daran erinnern, was wir alle wissen (z. B. explizite Umwandlung ist schlecht – das führt zur Prägung von Schimpfwörtern).Entscheiden Sie sich nicht für den C++-Stil, wenn Sie die Kunst der Nachverfolgung von Laufzeitfehlern erlernen möchten.

Die Konstruktorsyntax.C++ ist OO, es gibt Konstruktoren, ich verwende sie.Wenn Sie das Bedürfnis verspüren, diese Konvertierungsfaktoren mit Anmerkungen zu versehen, sollten Sie dies für jeden Typ tun, nicht nur für die integrierten.Möglicherweise verwenden Sie das Schlüsselwort „explicit“ für Konvertierungs-Ctors, aber die Client-Syntax ahmt genau das nach, was die Ctor-Syntax für integrierte Typen tut.Das mag zwar stimmen, aber es ist eine große Überraschung, dass die Eingabe weiterer Zeichen die Suche erleichtert.Warum diese als etwas Besonderes behandeln?Wenn Sie mathematische Formeln mit vielen int/unsigned/... schreibenzu und von double/float - Grafiken - und Sie jedes Mal einen static_cast schreiben müssen, wird das Aussehen der Formel unübersichtlich und sehr unleserlich.Und es ist sowieso ein harter Kampf, da man oft konvertiert, ohne es überhaupt zu merken.Für Downcasting-Zeiger verwende ich den static_cast, da es natürlich standardmäßig keinen Ctor gibt, der das tun würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top