36

通常のキャスト vs. static_cast vs. dynamic_castに関する質問:

C++ で好きなキャスト構文スタイルは?

  • C スタイルのキャスト構文:(int)foo
  • C++ スタイルのキャスト構文:static_cast<int>(foo)
  • コンストラクターの構文:int(foo)

それらはまったく同じ命令に変換されないかもしれませんが (そうですか?)、その効果は同じはずです (そうですか?)。

組み込みの数値型の間でキャストするだけなら、C++ スタイルのキャスト構文は冗長すぎると思います。元 Java コーダーとして、代わりに C スタイルのキャスト構文を使用する傾向がありますが、私の地元の C++ グルは、コンストラクター構文の使用を主張しています。

どう思いますか?

4

10 に答える 10

58

次の3 つの主な理由から、C スタイルのキャストを使用しないことをお勧めします。

  • すでに述べたように、ここではチェックは実行されません。プログラマーは、強力な型付けを弱めるさまざまなキャストのどれが使用されているかを単純に知ることができません。
  • 新しいキャストは、意図的に視覚的に印象的です。キャストはコードの弱点を明らかにすることが多いため、コード内でキャストを可視化することは良いことであると主張されています。
  • これは、自動ツールでキャストを検索する場合に特に当てはまります。C スタイルのキャストを確実に見つけることはほぼ不可能です。

palm3D が指摘したように:

C++ スタイルのキャスト構文は冗長すぎると思います。

上記の理由により、これは意図的なものです。

コンストラクターの構文 (正式名称: 関数スタイルのキャスト) は、C スタイルのキャストと意味的に同じであり、同じ理由で (宣言時の変数の初期化を除いて) 回避する必要があります。これがカスタム コンストラクターを定義する型に対しても当てはまるかどうかは議論の余地がありますが、Effective C++ では、そのような場合でもそれらの使用を控えるべきであると Meyers は主張します。説明する:

void f(auto_ptr<int> x);

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

static_casthere は実際にauto_ptrコンストラクターを呼び出します。

于 2008-08-28T13:16:18.267 に答える
15

Stroustrupによると:

「新しいスタイルのキャスト」は、プログラマーが意図をより明確に述べる機会を与え、コンパイラーがより多くのエラーを検出できるようにするために導入されました。

本当に、それは追加のコンパイル時のチェックを行うため、安全のためです。

于 2008-08-28T13:07:28.523 に答える
7

この件に関して、私はScott Meyersによる推奨に従っています(より効果的な C++、項目 2 : C++ スタイルのキャストを優先する)。

C++ スタイルのキャストが冗長であることには同意しますが、それが私が好きなところです。それらは非常に見つけやすく、コードを読みやすくします (これは書くことよりも重要です)。

また、必要なキャストの種類を考え、適切なキャストを選択することを強制し、ミスのリスクを減らします。また、実行時ではなくコンパイル時にエラーを検出するのにも役立ちます。

于 2008-08-28T13:19:32.160 に答える
3

コンストラクターの構文。C++ は OO であり、コンストラクターが存在し、それらを使用します。これらの変換 ctor に注釈を付ける必要がある場合は、組み込みのものだけでなく、すべての型に対して注釈を付ける必要があります。変換 ctor に 'explicit' キーワードを使用するかもしれませんが、クライアント構文は、組み込み型の ctor 構文が行うことを正確に模倣します。greppable であることは事実かもしれませんが、より多くの文字を入力すると検索が簡単になるという大きな驚きがあります。これらを特別なものとして扱うのはなぜですか?多くの int/unsigned/... を含む数式を double/float (グラフィックス) との間で記述していて、毎回 static_cast を記述する必要がある場合、数式の外観が乱雑になり、非常に読みにくくなります。とにかく困難な戦いです。多くの場合、自分が改宗していることにさえ気付かずに改宗してしまうからです。

于 2016-12-23T14:48:58.503 に答える
3

私が static_cast を使用する理由は 2 つあります。

  1. 何が起こっているかは明白です。キャストが進行中であることに気付かずに、それを読むことはできません。C スタイルのキャストを使用すると、目が止まることなく真上を通過できます。
  2. キャストしているコード内のすべての場所を簡単に検索できます。
于 2008-08-28T13:16:29.983 に答える
3

間違いなく C++ スタイルです。余分な入力は、キャストしてはいけないときにキャストするのを防ぐのに役立ちます:-)

于 2008-08-28T13:17:26.207 に答える
1

C スタイルのキャスト構文で、エラー チェックを行いません。C++ スタイルのキャスト構文で、いくつかのチェックを行います。static_cast を使用する場合、チェックを行わなくても、少なくともここで注意する必要があることはわかっています。

于 2008-08-28T13:04:20.573 に答える
1

C スタイルのキャストは最悪の方法です。見るのが難しく、greppable ではなく、混同してはならないさまざまなアクションを混同し、C++ スタイルのキャストが実行できるすべてを実行することはできません。彼らは本当に、言語から C スタイルのキャストを削除する必要がありました。

于 2008-08-28T13:11:10.433 に答える
1

現在、どこでも C スタイルのキャストを使用しています。私は他のキャスティングの質問をしましたが、「greppable」以外の理由がなければ、代わりに static_cast を使用する利点がわかります(私はその用語が好きです)。私はおそらくそれを使い始めるでしょう。

私は C++ スタイルが好きではありません。関数呼び出しのように見えます。

于 2008-08-28T13:30:28.360 に答える
1

C++ スタイルを採用すれば、さらに悪いことに、C++ の明示的な型キャストを構成する醜い冗長なコード スニペットは、私たち全員が知っていることを常に思い起こさせることになります (つまり、明示的なキャストは悪いものであり、罵倒の造語につながります)。実行時エラーを追跡する技術を習得したい場合は、C++ スタイルを使用しないでください。

于 2012-02-26T21:18:30.953 に答える