C キャスト 新しいページはコチラ
提供: yonewiki
1行: | 1行: | ||
+ | [[C PlusPlus#Cにもあった技術|C++]]へ戻る | ||
+ | |||
+ | |||
※このページではC言語にも存在していたという意味で記事タイトルが<nowiki>C -キャスト</nowiki>になっていますが、<br /> | ※このページではC言語にも存在していたという意味で記事タイトルが<nowiki>C -キャスト</nowiki>になっていますが、<br /> | ||
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | ||
<br /> | <br /> | ||
== '''キャスト''' == | == '''キャスト''' == | ||
− | 型変換/型変更/ | + | |
+ | 型変換/型変更/const外しor戻しを行うことをキャストと呼びます。const外しは少し特殊な表現ですが、constと同時に定義される型の変更と思えば、型に関する処理という意味では同じです。キャストcastには割り当てるという意味がありますので、新しい型を割り当てる処理と考えれば、それぞれの変換の総称になっていることも納得できるでしょうか。 | ||
67行: | 71行: | ||
− | * | + | *const外しor戻し |
pnLimit = (int*)pconstnLimit; | pnLimit = (int*)pconstnLimit; | ||
79行: | 83行: | ||
*static_cast 変換 | *static_cast 変換 | ||
*reinterpret_cast 変更 | *reinterpret_cast 変更 | ||
− | *const_cast | + | *const_cast const外しor戻し |
*dynamic_cast | *dynamic_cast | ||
91行: | 95行: | ||
pintLength = (int*)puintLength; | pintLength = (int*)puintLength; | ||
pintLength = '''reinterpret_cast<int*>'''puintLength; | pintLength = '''reinterpret_cast<int*>'''puintLength; | ||
− | * | + | *const外しor戻し |
pnLimit = (int*)pconstnLimit; | pnLimit = (int*)pconstnLimit; | ||
pnLimit = '''const_cast<int*>'''pconstnLimit; | pnLimit = '''const_cast<int*>'''pconstnLimit; | ||
+ | pconstnLimit = '''const_cast<const int*>'''pnLimit; | ||
− | dynamic_castはクラスの継承関係でcast可能なものと不可能なものがあり、親(基底クラス)から子(派生クラス)へのクラス名変換はキャスト動作はほぼ不可能で、その逆はキャストできるケースがあります。これは親より子の方が肉付けされる分だけ型は大きくなっているはずだからです。その逆の変換であれば、子クラスだけの機能やメンバ変数がそぎ落とされるものの変換が可能になります。このような変換の可否を実行時に判断してくれるのが、dynamic_castです。使い方は上の3つと同じです。クロスキャスト(親子の関係が無いクラス同志のキャスト)やダウンキャスト(そのままは使えない抽象クラスの変数で派生クラスにキャストする親から子をのキャスト) | + | dynamic_castはクラスの継承関係でcast可能なものと不可能なものがあり、親(基底クラス)から子(派生クラス)へのクラス名変換はキャスト動作はほぼ不可能で、その逆はキャストできるケースがあります。これは親より子の方が肉付けされる分だけ型は大きくなっているはずだからです。その逆の変換であれば、子クラスだけの機能やメンバ変数がそぎ落とされるものの変換が可能になります。このような変換の可否を実行時に判断してくれるのが、dynamic_castです。使い方は上の3つと同じです。クロスキャスト(親子の関係が無いクラス同志のキャスト)やダウンキャスト(そのままは使えない抽象クラスの変数で派生クラスにキャストする親から子をのキャスト)と呼ばれるキャストも実行時に検索します。キャストするクラスが仮想関数を保持している必要があるという制限もあります。const外しor戻しはできません。 |
− | + | 失敗すると例外をスローします。詳しいサンプルはまた後日。まずはクラス関連の記事を全部書いてから、自分もここに戻ってきて記事を書きたいと思います。たぶん、dynamic_castの記事ができるのは、数年後になりそうですね。ごめんなさい。言葉で、ダイナミックキャストのイメージだけでも伝われば幸い。詳しいことは、他のSiteで調べれば、よりイメージが具体化されるでしょう。どういうときに明示しなければエラーになるのか?どういう構造なら変換・変更・const外しができるのか?あいまいなままの説明になっているので、変換・変更・const外しor戻しの具体的なサンプルもあったほうがいいでしょうね。 | |
− | [[C PlusPlus|C++]]へ戻る | + | [[C PlusPlus#Cにもあった技術|C++]]へ戻る |