C キャスト 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(キャスト)
(キャスト)
56行: 56行:
 
  pintLength = (int*)puintLength;
 
  pintLength = (int*)puintLength;
  
 
+
のようにして型変更をします。今回の例では問題にならない変更になっていますが、まったく関係の無い型どうしでも変更できてしまいます。非常に危険です。引数に仮の型で受け取った関数でどの型の無いようになっているかが判明するような関数では、この仮の型から無理やり変更をする必要が生じる場合があるのかもしれません。変数の中におさめられている中身が変更に対応できるとわかっている場合に有効です。
 
そしてconst付きのint ポインタ変数にnLimitのアドレスを紐づけて、pconstnLimitからは中身を変更できないようにした場合
 
そしてconst付きのint ポインタ変数にnLimitのアドレスを紐づけて、pconstnLimitからは中身を変更できないようにした場合
  
71行: 71行:
  
  
のようにすることができます。キャストは型の大きさに違いがなく、型名が変換できるものや、変更できるものに使いますが、もっと大きなサイズの変数となる構造体やクラスのキャストはキャストできるできないの判定に複雑さが増します。
+
のようにすることができます。const_castは最大の違反ですので、これを使うという事はプログラム自体に問題があるので修正することが正しい道なはずですが、引数の変数や文字列の中身を何も変更しない関数なのに何かの手違いで、const以外の変数を引数に指定している変更するだけの権限や時間が無い既存の関数が与えられた場合に使うことになります。const外しをしないとコンパイルエラーになるのを一時的に回避する手段だと考えていいでしょう。他にもconstに似た使い方をする最適化のためのオプションvolatile外し(こちらはあまり知られていない)としても動作します。キャストは型の大きさに違いがなく、型名が変換できるものや、変更できるものに使いますが、もっと大きなサイズの変数となる構造体やクラスのキャストはキャストできるできないの判定に複雑さが増します。
  
  
このような難しい型の変換もあるという背景とキャストに対する仕組みの改善からC++では新しいcastの指定が4つ増えました。
+
このような難しい型の変換もあるという背景とキャストに対する仕組みの改善からC++では新しいcastの指定が4つ増えました。変換を有効に利用することも使い手しだいですが、危険を冒していることに気付かなければキャスト処理は崩壊を招きます。よく使うキャスト、苦し紛れのキャスト、とんでもないキャスト、間違ったキャスト。いろいろできます。最終的に正しく動作するなら、それでもいいってことになります。でも治せるものは早くなおしなよっていう感じですね。
  
  
96行: 96行:
  
  
dynamic_castはクラスの継承関係でcast可能なものと不可能なものがあり、親(基底クラス)から子(派生クラス)へのクラス名変換はキャスト動作はほぼ不可能で、その逆はキャストできるケースがあります。これは親より子の方が肉付けされる分だけ型は大きくなっているはずだからです。その逆の変換であれば、子クラスだけの機能やメンバ変数がそぎ落とされるものの変換が可能になります。このような変換の可否を実行時に判断してくれるのが、dynamic_castです。使い方は上の3つと同じです。クロスキャスト(親子の関係が無いクラス同志のキャスト)やダウンキャスト(そのままは使えない抽象クラスの変数で派生クラスにキャストする親から子をへのキャスト)と呼ばれるキャストも実行時に検索します。
+
dynamic_castはクラスの継承関係でcast可能なものと不可能なものがあり、親(基底クラス)から子(派生クラス)へのクラス名変換はキャスト動作はほぼ不可能で、その逆はキャストできるケースがあります。これは親より子の方が肉付けされる分だけ型は大きくなっているはずだからです。その逆の変換であれば、子クラスだけの機能やメンバ変数がそぎ落とされるものの変換が可能になります。このような変換の可否を実行時に判断してくれるのが、dynamic_castです。従来のキャストと同じ使い方で、実行時にキャストの可否を判断させることもできます。使い方は上の3つと同じです。クロスキャスト(親子の関係が無いクラス同志のキャスト)やダウンキャスト(そのままは使えない抽象クラスの変数で派生クラスにキャストする親から子をのキャスト)と呼ばれるキャストも実行時に検索します。const外しはできません。
  
  
 
失敗すると例外をスローします。詳しいサンプルはまた後日。まずはクラス関連の記事を全部書いてから、自分もここに戻ってきて記事を書きたいと思います。たぶん、dynamic_castの記事ができるのは、数年後になりそうですね。ごめんなさい。言葉で、ダイナミックキャストのイメージだけでも伝われば幸い。詳しいことは、他のSiteで調べれば、よりイメージが具体化されるでしょう。どういうときに明示しなければエラーになるのか?どういう構造なら変換・変更・const外しができるのか?あいまいなままの説明になっているので、変換・変更・const外しの具体的なサンプルもあったほうがいいでしょうね。
 
失敗すると例外をスローします。詳しいサンプルはまた後日。まずはクラス関連の記事を全部書いてから、自分もここに戻ってきて記事を書きたいと思います。たぶん、dynamic_castの記事ができるのは、数年後になりそうですね。ごめんなさい。言葉で、ダイナミックキャストのイメージだけでも伝われば幸い。詳しいことは、他のSiteで調べれば、よりイメージが具体化されるでしょう。どういうときに明示しなければエラーになるのか?どういう構造なら変換・変更・const外しができるのか?あいまいなままの説明になっているので、変換・変更・const外しの具体的なサンプルもあったほうがいいでしょうね。

2014年10月21日 (火) 00:00時点における版



個人用ツール
名前空間

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