質問

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)の目的は何ですか?

役に立ちましたか?

解決

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

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

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

  

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

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

他のヒント

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

new ステートメントから返される参照は、ポインターに割り当てられていないと思います。 this が渡されるので、QTはその参照で何かをする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top