2009-06-22 6 views
10

J'ai regardé un Qt tutorial qui utilise une construction que je ne l'ai pas vu avant:Que signifie "(void) new" en C++?

(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())); 

J'ai essayé cela sans (void) et il compile et travaille encore, alors quel est le but de le (void)?

+1

Transforme le niveau d'avertissement de votre compilateur jusqu'à max. Compiler sans le (vide) et voir ce qui se passe. –

+0

Mais la plupart du temps, je vois cela parce que quelqu'un a écrit C et ne réalise pas que vous n'avez plus besoin de la conversion. –

Répondre

21

Passer une expression à (void) indique au compilateur d'ignorer le résultat de cette expression (après l'avoir calculé). Dans votre exemple, chacune des expressions (par instruction/ligne) alloue dynamiquement de la mémoire via le nouvel opérateur - et puisque new renvoie un pointeur (adresse) à la mémoire, la pratique habituelle est de stocker ce pointeur dans un variable que vous pouvez utiliser pour éventuellement supprimer l'objet et libérer la mémoire. Dans votre exemple, puisque le pointeur est ignoré, une distribution explicite vers (void) rend l'intention du programmeur claire: "Je sais exactement ce que je fais - veuillez supprimer la valeur retournée par new"

Si vous êtes intéressé par les aspects techniques (en citant le standard C++, clause 5):

Toute expression peut être explicitement convertie en type cv void. La valeur d'expression est rejetée. [Note: cependant, si la valeur est dans une variable temporaire (12.2), le destructeur de cette variable n'est pas exécuté avant l'heure habituelle, et la valeur de la variable est conservée dans le but d'exécuter le destructeur. -end note]
Les conversions standard lvalue-to-rvalue (4.1), array-to-pointter (4.2) et function-to-pointter (4.3) ne sont pas appliquées à l'expression.

Et si vous vous demandez comment ces objets sont se supprimés (si bien qu'ils obtiennent supprimés), la réponse est que « ceci » pointeur dans le constructeur de QShortcut doit avoir la même valeur que celle retournée par la nouvelle , et cela peut être passé à un gestionnaire de raccourci. Notez que le 'this' dans le constructeur n'est pas le même que le pointeur 'this' qui est passé au constructeur de QShortcut.

7

Certains compilateurs C++ donneront un avertissement si vous jetez la valeur de retour d'une fonction comme celle-ci. Dans ce cas, le code semble avoir perdu de la mémoire, vous recevez donc un avertissement. Le (void) indique au compilateur de ne pas émettre l'avertissement: "Traitez cette fonction comme si elle renvoyait void".

0

Je pense que la référence renvoyée par l'instruction new n'est pas affectée à un pointeur. Je vois que this est passé, donc QT doit faire quelque chose avec cette référence.