2011-08-30 16 views
2

static_castの場合、組込み型変換関数がないかぎり、static_castを使用して変換を実行できません。戻り値の型が有効であることを考慮して、型に対してreinterpret_castを実行できます。明示的な型変換の必要条件

int main() 
{ 
    WORD word; 
    HWND hwnd = static_cast<HWND>(word); // error 
    HWND hwnd = reinterpret_cast<HWND>(word); // ok, considering a valid handle is returned. 
} 

static_castで行われた明示的な型変換では、reinterpret_castとは異なり変換関数が必要ですか?

+0

Uhm ...具体的に何が質問ですか? –

+0

@Jason - static_castがエラーの場合は、おそらくreinterpret_castもそうです。コンパイラはあなたに言いません。 –

答えて

2

reinterpret_cast完全に無関係のタイプを変換することができます。それはちょうど別のタイプとしてメモリのチャンクを扱います。コンパイルエラーやランタイムエラーは発生しませんが、(通常)クラッシュが発生するだけなので、使用することは非常に危険です。

static_castは、コンパイル時にキャストの有効性をチェックします。ある型を別の型として扱うことができない場合、static_castはキャストを試みるときにコンパイル時エラーを返します。 型間の暗黙的な変換(float型へのint、void *へのポインタなど)、明示的変換関数(または暗黙的変換関数)を呼び出すこともできます。

暗黙の変換inbuilt関数が存在する暗黙のキャストができると言うことができます。それが混乱の場合は、通常、Cスタイルのキャストの代わりに使用されます。

+0

忘れてしまったことは、 'reinterpret_cast'は、型を元の型にキャストすると、同じ結果を得ることを保証しているということです。 –

+1

" reinterpret_castによって実行されるマッピングは、元の値から。特定の状況下でのみ、reinterpret_castが信頼できるものとなります。それは避けるべきです。 –

+0

好奇心のために、 'reinterpret_cast (myfloat)できます!= static_cast (myfloat) '、 'sizeof(int)== sizeof(float)'で指定されていますか? –

0

C++のキャストは、ポインタと参照をキャストするときに最も適しています。

具体例

void foo (Base & b) { 
    if (b .is_a_Foo()) 
     static_cast <Foo &> (b) .bar(); 
    else 
     b .do_default_bar(); 
    dynamic_cast <Baz &> (b) .something(); // throws if invalid conversion 
} 

char data [4]; 
* reinterpret_cast <float *> (data) = 1.23; 

のWindows APIは、上から下に恐ろしいハックです - あなたの例では、reinterpret_castは、元の意図に忠実な(そして賞賛する世界のためにそれを強調して)、それは基本的「型のシステムを捨て、生のビットを使う:信頼してください」という意味です。

0

は基本的にstatic_cast互換性のあるクラスタイプのサイズにメモリを割り当て、任意のは、新しいオブジェクトが完全ある確認せず何ができるかが、でそれを埋めます。例を挙げましょう:あなたの例では

class A { 
public: 
    int a; 
}; 

class B : public A { 
public: 
    int c; 
    int b; 
}; 

int main() 
{ 
    A *a = new A; 
    a->a = 5; 
    B *b = new B; 
    b->a = 6; 
    b->b = 7; 
    b->c = 8; 

    B* bb = static_cast<B*>(a); 
    A* aa = static_cast<A*>(b); 

    cout << bb->a << endl; // 5 
    cout << bb->b << endl; // scrap value from memory 
    // member b was not initialized, because it was not found in A 

    cout << aa->a << endl; // 6 

    return 0; 
} 

hwndvoid *wordunsigned shortであるため、静的キャストは、無効です。 C++キャストの場合、どの型もクラスと見なすことができます。

reinterpret_cast works 常にです。それは単なるバイナリコピーです

関連する問題