[解決済み] レギュラーキャスト vs スタティックキャスト vs ダイナミックキャスト [重複]の比較
質問
私は20年近くCとC++のコードを書いているが、これらの言語のある側面がよく理解できていない。私は当然ながら通常のキャスト、すなわち
MyClass *m = (MyClass *)ptr;
があちこちにありますが、他にも2種類のキャストがあるようで、その違いがわかりません。以下のコードの行は何が違うのでしょうか?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
解決方法は?
静的キャスト
static_cast` は、基本的に暗黙の変換を逆変換したい場合に使用しますが、いくつかの制限や追加もあります。static_cast` は実行時のチェックを行いません。これは、特定の型のオブジェクトを参照していることが分かっていて、チェックが不要な場合に使用されるはずである。例void func(void *data) {
// Conversion from MyClass* -> void* is implicit
MyClass *c = static_cast<MyClass*>(data);
...
}
int main() {
MyClass c;
start_thread(&func, &c) // func(&c) will be called
.join();
}
この例では、あなたが
MyClass
オブジェクトを生成するため、これを確認するための実行時チェックは必要ありません。
ダイナミックキャスト
dynamic_cast` は、オブジェクトの動的な型がわからない場合に便利です。参照されるオブジェクトが、キャストされた型を基底クラスとして含んでいない場合、null ポインタを返す (参照にキャストした場合、その場合は `bad_cast` 例外がスローされる)。if (JumpStm *j = dynamic_cast<JumpStm*>(&stm)) {
...
} else if (ExprStm *e = dynamic_cast<ExprStm*>(&stm)) {
...
}
を使用することはできません。
dynamic_cast
ダウンキャスト(派生クラスへのキャスト)した場合、引数の型が多相性でない場合。たとえば、次のコードは無効です。
Base
は仮想関数を含んでいません。
struct Base { };
struct Derived : Base { };
int main() {
Derived d; Base *b = &d;
dynamic_cast<Derived*>(b); // Invalid
}
アップキャスト(基底クラスへのキャスト)は、常に次の2つの方法で有効です。
static_cast
と
dynamic_cast
また、アップキャストは暗黙のうちに変換されるため、キャストは不要です(ベースクラスがアクセス可能であると仮定して、つまり、それは
public
を継承している)。
レギュラーキャスト
これらのキャストは、C-styleキャストとも呼ばれます。C スタイルのキャストは、基本的に C++ キャストのシーケンスをさまざまに試し、最初に動作した C++ キャストを採用するのと同じです。
dynamic_cast
. もちろん、この方法は、すべての
const_cast
,
static_cast
と
reinterpret_cast
を使用しないため、安全ではありません。
dynamic_cast
.
また、C言語スタイルのキャストでは、このようなことができるだけでなく、プライベートなベースクラスへのキャストを安全に行うことができ、一方、"equivalent"
static_cast
というシーケンスでは、コンパイル時にエラーが発生します。
簡潔であるため、Cスタイルのキャストを好む人もいます。私は、数値のキャストのみにこの方法を使用し、ユーザー定義型が含まれる場合は、より厳密なチェックを行うため、適切なC++のキャストを使用します。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] なぜ (int)x ではなく static_cast<int>(x) を使うのですか?
-
[解決済み] JavaでDoubleをIntegerにキャストする
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】static_cast<>とC言語のキャストの違いは何ですか?
-
[解決済み] C++のdynamic_castとstatic_cast
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] スタティック・キャストとダイナミック・キャスト [重複] の比較
-
[解決済み] C++形式のキャストでintをcharにキャストする [重複] [重複
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?