10

以前に見たことのない構造を使用するQtチュートリアルを見てきました。

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

なしでこれを試してみましたが、(void)コンパイルして動作しますが、の目的は何(void)ですか?

4

3 に答える 3

21

式を (void) にキャストすると、基本的にコンパイラーはその式の結果を (計算後に) 無視するように指示されます。

あなたの例では、各式 (ステートメント/行ごと) が new 演算子を介して動的にメモリを割り当てています。また、new はメモリへのポインター (アドレス) を返すため、通常の方法は、そのポインターを変数に格納することです。最終的にオブジェクトを削除し、メモリの割り当てを解除するために使用します。あなたの例では、ポインターが破棄されているため、 (void) への明示的なキャストにより、プログラマーの意図が明確になります。

技術に興味がある場合 (C++ 標準の第 5 節から引用):

どの式も cv void 型に明示的に変換できます。式の値は破棄されます。[注: ただし、値が一時変数 (12.2) にある場合、その変数のデストラクタは通常の時間まで実行されず、変数の値はデストラクタを実行する目的で保持されます。--end note ]
左辺値から右辺値 (4.1)、配列からポインター (4.2)、および関数からポインター (4.3) への標準変換は、式には適用されません。

これらのオブジェクトがどのように削除されているのか (実際に削除されている場合) を疑問に思っている場合、答えは、QShortcut のコンストラクター内の「this」ポインターは、new によって返される値と同じ値を持つ必要があり、それを渡すことができるということです。 ShortcutManager に。コンストラクター内の「this」は、QShortcut のコンストラクターに渡される「this」ポインターと同じではないことに注意してください。

于 2009-06-22T22:38:43.860 に答える
7

そのような関数の戻り値を破棄すると、一部の C++ コンパイラは警告を出します。この場合、コードでメモリ リークが発生しているように見えるため、警告が表示されます。は(void)、コンパイラに次の警告を発行しないように指示しますvoid

于 2009-06-22T22:38:28.913 に答える
0

newステートメントから返された参照がポインターに割り当てられていないと思います。それが渡されていることがわかりますthisので、QTはその参照で何かをしなければなりません。

于 2009-06-22T22:40:09.473 に答える