質問
に関連した質問 レギュラーキャスト vs.static_cast とダイナミックキャスト:
C++ ではどのキャスト構文スタイルが好みですか?
- C スタイルのキャスト構文:
(int)foo
- C++ スタイルのキャスト構文:
static_cast<int>(foo)
- コンストラクター構文:
int(foo)
それらはまったく同じ命令に変換されないかもしれません (そうですよね?) が、その効果は同じであるはずです (そうですよね?)。
組み込みの数値型間でキャストするだけの場合、C++ スタイルのキャスト構文は冗長すぎると思います。元 Java プログラマーとして、私は代わりに C スタイルのキャスト構文を使用する傾向がありますが、私の地元の C++ の第一人者はコンストラクター構文を使用することを主張しています。
どう思いますか?
解決
ベストプラクティスです 一度もない C スタイルのキャストを使用する主な理由は次の 3 つです。
- すでに述べたように、ここではチェックは行われません。プログラマは、さまざまなキャストのどれが使用されているかを単純に知ることができず、それが強力な型付けを弱めます。
- 新しいキャストは意図的に視覚的に印象的なものになっています。キャストはコードの弱点を明らかにすることが多いため、コード内でキャストを見えるようにするのは良いことだと主張されています。
- これは、自動ツールを使用してキャストを検索する場合に特に当てはまります。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_cast
ここで実際に呼び出すのは、 auto_ptr
コンストラクタ。
他のヒント
によると ストルストラップ:
「ニュースタイルキャスト」が紹介されました プログラマーに述べる機会を与えるために 彼らの意図はもっとはっきりそしてのために コンパイラは、より多くのエラーをキャッチします。
つまり、コンパイル時に追加のチェックを行うため、安全のためです。
この件に関して、私は次の勧告に従っています。 スコット・マイヤーズ (より効果的な C++, 、項目 2 :C++ スタイルのキャストを優先します)。
C++ スタイルのキャストが冗長であることに同意しますが、それが私が気に入っている点です。これらは非常に見つけやすく、コードを読みやすくします (これは書くことよりも重要です)。
また、どのような種類のキャストが必要かを考え、正しいものを選択する必要があるため、間違いのリスクが軽減されます。また、実行時ではなくコンパイル時にエラーを検出するのにも役立ちます。
私が static_cast を使用する理由は 2 つあります。
- 何が起こっているかは明らかです。キャストが進行していることに気付かずにそれを読むことはできません。C スタイルのキャストを使用すると、目が止まることなくその上を通過できます。
- コード内でキャストしているすべての場所を検索するのは簡単です。
間違いなく C++ スタイルです。追加の入力は、キャストすべきではないときにキャストするのを防ぐのに役立ちます:-)
C スタイルのキャスト構文。エラー チェックは行われません。C++ スタイルのキャスト構文で、いくつかのチェックが行われます。static_cast を使用する場合、チェックを行わない場合でも、少なくともここで注意する必要があることがわかります。
C スタイルのキャストは最悪の方法です。見づらく、grep できず、混同すべきではないさまざまなアクションが混同され、C++ スタイルのキャストで実行できるすべてのことは実行できません。本当に言語から C スタイルのキャストを削除するべきでした。
現在、どこでも C スタイルのキャストを使用しています。相手に聞いてみた キャストの質問, そして、「greppable」(私はこの用語が好きです)以外の理由がない場合、代わりに static_cast を使用する利点がわかりました。おそらくそれを使い始めるでしょう。
私は C++ スタイルが好きではありません。関数呼び出しに似すぎています。
C++ スタイルを選択すると、さらに悪いことに、C++ の明示的なタイプキャストを構成する醜く冗長なコード スニペットが、私たち全員が知っていることを常に思い出させることになります (つまり、明示的なキャストは悪いことです。悪口の造語につながります)。ランタイム エラーを追跡する技術を習得したい場合は、C++ スタイルを使用しないでください。
コンストラクターの構文。C++ は OO であり、コンストラクターが存在するので、それを使用します。これらの変換 ctor に注釈を付ける必要があると感じた場合は、組み込みのものだけでなく、すべての型に対して注釈を付ける必要があります。おそらく、変換 ctor に 'explicit' キーワードを使用しますが、クライアント構文は、組み込み型の ctor 構文の動作を正確に模倣します。grepable であることは事実かもしれませんが、より多くの文字を入力することで検索が簡単になることは大きな驚きです。なぜこれらを特別なものとして扱うのでしょうか?多くの int/unsigned/... を使用して数式を作成している場合double/float - グラフィックス - へのやり取りがあり、毎回 static_cast を記述する必要があるため、数式の外観が乱雑になり、非常に読みにくくなります。そして、多くの場合、自分がそうであることに気付かずに改宗することになるため、いずれにせよ、それは困難な戦いです。ポインタのダウンキャストには、もちろん static_cast を使用します。これを行うデフォルトの ctor は存在しません。