Frage

Ich habe in einem Qt suchen Tutorial , die einen Aufbau I verwendet habe nicht gesehen, vor:

 (void) new QShortcut(Qt::Key_Enter, this, SLOT(fire()));
 (void) new QShortcut(Qt::Key_Return, this, SLOT(fire()));
 (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));

Ich habe schon versucht, diese ohne die (void) und kompiliert es immer noch und arbeitet, so was ist der Zweck des (void)?

War es hilfreich?

Lösung

Casting einen Ausdruck (void) sagt den Compiler das Ergebnis dieses Ausdrucks zu ignorieren (nach dem es der Berechnung).

In Ihrem Beispiel jeder der Ausdrücke (pro Statement / Zeile) wird die Zuweisung dynamisch Speicher über den neuen Betreiber - und da neue gibt einen Zeiger (Adresse) an den Speicher, ist die übliche Praxis, dass die Zeiger in einer Variablen zu speichern dass Sie eventuell verwenden, um das Objekt zu löschen und den Speicher freigeben. In Ihrem Beispiel, da der Zeiger verworfen wird, eine explizite Umwandlung zu (void) macht die Absicht des Programmierers klar: „Ich weiß genau, was ich tue - bitte den Wert zurück durch neue verwerfen“

Wenn Sie in den technischen Details interessiert sind (aus dem Standard-C ++ zitiert, Abschnitt 5):

  

kann ein beliebiger Ausdruck explizit eingeben cv nichtig umgewandelt werden. Der Ausdruck Wert wird verworfen. [Anmerkung: Wenn jedoch der Wert in einer temporären Variablen (12.2) ist, wird der Destruktor für diese Variable nicht bis zur üblichen Zeit ausgeführt, und der Wert der Variablen für den Zweck erhält den destructor auszuführen. -Ende beachten]
  Der L-Wert-zu-R-Wert (4,1), array-zu-Zeiger (4.2), und die Funktion-zu-Zeiger (4.3) Standardumwandlungen sind nicht auf den Ausdruck angewandt wird.

Und wenn Sie sich fragen, wie diese Objekte werden immer gelöscht (wenn in der Tat sie gelöscht wird immer), die Antwort ist, dass die ‚this‘ Zeiger im Konstruktor von QShortcut sollten den gleichen Wert haben wie die durch neue zurückgekehrt, und dass kann auf eine ShortcutManager weitergegeben werden. Beachten Sie, dass der ‚dies‘ innerhalb des Konstruktor ist nicht das gleiche wie die ‚this‘ Zeiger, der an den Konstruktor QShortcut geben wird.

Andere Tipps

Einige C ++ Compiler eine Warnung geben, wenn Sie den Rückgabewert einer Funktion wie das wegzuwerfen. In diesem Fall sieht der Code wie es Speicherlecks, so erhalten Sie eine Warnung. Der (void) teilt den Compiler die Warnung nicht zu emittieren. „Behandle diese Funktion, als ob es void zurück“

Ich denke, die Referenz aus der new Anweisung zurück nicht auf einen Zeiger zugeordnet ist. Ich sehe, dass this geben wird so QT etwas mit dieser Referenz tun müssen.

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