static_cast<>
Cスタイルのキャスティングよりも好む理由はありますか?それらは同等ですか?速度の違いはありますか?
7 に答える
C ++スタイルのキャストは、コンパイラーによってチェックされます。Cスタイルのキャストはそうではなく、実行時に失敗する可能性があります。
また、c ++スタイルのキャストは簡単に検索できますが、cスタイルのキャストを検索するのは非常に困難です。
もう1つの大きな利点は、4つの異なるC++スタイルのキャストがプログラマーの意図をより明確に表現していることです。
C ++を書くとき、私はほとんどの場合、CスタイルよりもC++のものを使用します。
要するに:
static_cast<>()
コンパイル時のチェック機能を提供しますが、C-Styleキャストは提供しません。static_cast<>()
より読みやすく、C++ソースコード内のどこにでも簡単に見つけることができます。C_Styleキャストは'ntです。- 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 ++キャストの詳細については、このページを確認することもできます。ここをクリックしてください。
C++キャスト演算子の比較を参照してください。
ただし、さまざまな異なるキャスト操作に同じ構文を使用すると、プログラマーの意図が不明確になる可能性があります。
さらに、大規模なコードベースで特定のタイプのキャストを見つけるのは難しい場合があります。
Cスタイルのキャストの一般性は、必要なのが単純な変換だけである状況ではやり過ぎになる可能性があります。パワーの程度が異なるいくつかの異なるキャスト演算子から選択する機能により、プログラマーが誤って誤ったタイプにキャストするのを防ぐことができます。
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!
}
C / C ++のさまざまなキャストと、Cスタイルのキャストが実際に行うことを説明するすばらしい投稿:https ://anteru.net/blog/2007/12/18/200/index.html
(型)変数構文を使用したCスタイルのキャスト。史上最悪の発明。これにより、次のキャストがこの順序で実行されます(C ++標準、5.4 expr.cast段落5も参照)。
- const_cast
- static_cast
- static_castの後にconst_castが続く
- reinterpret_cast
- reinterpret_castfollowed by const_cast
static_cast
コンパイル時に、変換が明らかに互換性のないタイプ間ではないことを確認します。とは異なりdynamic_cast
、実行時に型の互換性のチェックは行われません。また、static_cast
変換は必ずしも安全ではありません。
static_cast
ポインタから基本クラスへのポインタから派生クラスへのポインタへの変換、またはenumからint、floatからintなどのネイティブ型間の変換に使用されます。
のユーザーはstatic_cast
、変換が安全であることを確認する必要があります。
Cスタイルのキャストは、コンパイル時または実行時にチェックを実行しません。
それぞれ異なるセマンティクスを持つさまざまな種類のキャストがあるため、static_cast <>を使用すると、intからdoubleへのように、「ある型から別の型への合法的な変換を行っています」と言うことができます。プレーンなCスタイルのキャストは多くのことを意味します。アップ/ダウンキャストですか?ポインタを再解釈していますか?