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

2017年5月29日 (月) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス