web-dev-qa-db-ja.com

static_cast <>とCスタイルのキャストの違いは何ですか?

Cスタイルのキャストよりstatic_cast<>を好む理由はありますか?それらは同等ですか?速度の違いはありますか?

182
dicroce

C++スタイルのキャストは、コンパイラーによってチェックされます。 Cスタイルのキャストは実行されず、実行時に失敗する可能性があります

また、C++スタイルのキャストは簡単に検索できますが、Cスタイルのキャストを検索するのは本当に難しいです

もう1つの大きな利点は、4つの異なるC++スタイルのキャストがプログラマの意図をより明確に表現することです。

C++を書くとき、私はほとんど常にCスタイルよりもC++を使用します。

199
Glen

要するに

  1. static_cast<>()はコンパイル時のチェック機能を提供しますが、Cスタイルのキャストは提供しません。
  2. static_cast<>()は読みやすく、C++ソースコード内のどこにでも簡単に見つけることができますが、C_Styleキャストはできません。
  3. C++キャストを使用すると、意図がはるかによく伝わります。

詳細説明

静的キャストは、互換タイプ間の変換を実行します。 Cスタイルのキャストに似ていますが、より制限的です。たとえば、Cスタイルのキャストでは、整数ポインターがcharを指すことができます。

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

これにより、割り当てられたメモリの1バイトを指す4バイトポインター(4バイトデータ型へのポインター)が生成されるため、このポインターに書き込むと、ランタイムエラーが発生するか、隣接するメモリが上書きされます。

*p = 5; // run-time error: stack corruption

Cスタイルのキャストとは対照的に、静的キャストを使用すると、コンパイラーはポインターとポインターのデータ型が互換性があることを確認できるため、プログラマーはコンパイル中にこの誤ったポインターの割り当てをキャッチできます。

int *q = static_cast<int*>(&c); // compile-time error

C++キャストの詳細については、このページを確認することもできます。 ここをクリック

163
Breeze

C++キャスト演算子の比較 を参照してください。

ただし、さまざまなキャスト操作に同じ構文を使用すると、プログラマの意図が不明確になる可能性があります。

さらに、大規模なコードベースで特定のタイプのキャストを見つけることは困難です。

cスタイルのキャストの一般性は、必要なのが単純な変換だけである場合には、やり過ぎになる可能性があります。程度の異なる複数の異なるキャスト演算子を選択できるため、プログラマーが誤って誤った型にキャストすることを防ぐことができます。

15
Eugene Yokota
struct A {};
struct B : A {};
struct C {}; 

int main()
{
    A* a = new A;    

    int i = 10;

    a = (A*) (&i); // NO ERROR! FAIL!

    //a = static_cast<A*>(&i); ERROR! SMART!

    A* b = new B;

    B* b2 = static_cast<B*>(b); // NO ERROR! SMART!

    C* c = (C*)(b); // NO ERROR! FAIL!

    //C* c = static_cast<C*>(b); ERROR! SMART!
}
15
Rishi Khaneja

static_castは、コンパイル時に明らかに互換性のない型間の変換ではないことを確認します。 dynamic_castとは異なり、型の互換性のチェックは実行時に行われません。また、static_cast変換は必ずしも安全ではありません。

static_castは、基本クラスへのポインターから派生クラスへのポインターへの変換、またはenumからintまたはfloatからintなどのネイティブ型間の変換に使用されます。

static_castのユーザーは、変換が安全であることを確認する必要があります。

Cスタイルのキャストは、コンパイル時または実行時にチェックを実行しません。

5
kiriloff

C/C++のさまざまなキャスト、およびCスタイルのキャストが実際に行うことを説明する素晴らしい投稿: https://anteru.net/blog/2007/12/18/200/index.html

(タイプ)変数構文を使用したCスタイルのキャスト。最悪の発明。これは、次のキャストをこの順序で実行しようとします(C++ Standard、5.4 expr.castパラグラフ5も参照)。

  1. const_cast
  2. static_cast
  3. static_castの後にconst_cast
  4. reinterpret_cast
  5. reinterpret_castの後にconst_castが続く
5
Ying Xiong

それぞれ異なるセマンティクスを持つさまざまな種類のキャストがあるため、static_cast <>を使用すると、intからdoubleへのように「あるタイプから別のタイプへの正当な変換を行っています」と言うことができます。単純なCスタイルのキャストは、多くのことを意味します。キャストをアップ/ダウンしていますか?ポインターを再解釈していますか?

4
Doug T.