「型変換」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
1行目:
{{出典の明記|date=2017年9月10日 (日) 07:38 (UTC)}}
'''型変換'''(かたへんかん、{{lang-en-short|type conversion}})とは[[プログラム (コンピュータ)|プログラム]]において、ある[[データ型]]を他のデータ型に変換することである<ref>{{Kotobank|型変換|2=ASCII.jpデジタル用語辞典}}</ref>。型キャスト({{lang-en-short|type casting}})とも呼ばれる<ref>{{Kotobank|型キャスト|2=デジタル大辞林}}</ref>。
ASCII.jpデジタル用語辞典}}</ref><ref>{{Kotobank|
型キャスト|2=デジタル大辞林}}</ref>。
 
== 分類 ==
63 ⟶ 61行目:
 
==== ダウンキャスト ====
ダウンキャストはアップキャストの逆で、基底クラスから派生クラスへの型変換、すなわち<tt>Base</tt>のインスタンスを<tt>Derived</tt>に変換する操作である。<tt>Base</tt>のインスタンスは必ずしも<tt>Derived</tt>のインスタンスとは限らないので、この変換は一般に安全ではなく、エラーが発生する可能性がある。そのため、多くの言語ではキャスト構文による明示的な変換の記述が必要である。通例、[[オブジェクト指向プログラミング]]では[[ポリモーフィズム]]を使うべきであり、ダウンキャストおよびクロスキャストが必要になるということはプログラムの設計に問題があることを示唆している。
 
[[C++]]では、安全なダウンキャストのために<ttcode>dynamic_cast</ttcode>という特別な構文が用意されている。この構文では、[[実行時型情報]]を参照し、ポインタ間の変換が失敗すると結果として<tt>[[ヌルポインタ#C++|NULL]]</tt>が返る。参照間の変換が失敗すると<code>std::bad_cast</code>例外がスローされる。<code>dynamic_cast</code>を使用するためには、型に[[仮想関数テーブル]]が必要となる。つまり、基底クラスに少なくとも1つの仮想関数を持つ必要がある。
 
[[Java]]では、ダウンキャストに失敗すると{{Javadoc:SE|name=java.lang.ClassCastException|java/lang|ClassCastException}}例外がスローされる。C++の<code>dynamic_cast</code>に相当する機能は存在しないが、<code>instanceof</code>演算子で型情報を問い合わせることはできる。
[[C Sharp|C#]]では、<code>as</code>演算子が用意されており、変換が失敗した場合は[[null]]が返る
 
[[C Sharp|C#]]では、ダウンキャストに失敗すると<code>System.InvalidCastException</code>例外がスローされる。また、<code>as</code>演算子が用意されており、変換が失敗した場合は[[null]]が返る
<ref>https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/as</ref>。
またC# 7.0では、<code>is</code>演算子が拡張され、変換可能性を[[ブーリアン型|bool型]]で返すと同時に、末尾で宣言した変数に変換結果が格納される
76行目:
あるクラス<tt>Derived</tt>が、二つの基底クラス<tt>Base1</tt>と<tt>Base2</tt>を[[多重継承]]しているとする。このとき、例えば<tt>Base1</tt>から<tt>Base2</tt>のように基底クラスどうしの間で型変換することをクロスキャストという。変換する対象が<tt>Derived</tt>のインスタンスであればキャストは成功するが、それは実行時にならないと分からないので、ダウンキャストと同様に安全な型変換ではない。
 
C++では、ダウンキャストと同じ構文<ttcode>dynamic_cast</ttcode>で安全なクロスキャストが行える。
 
==== 静的キャスト ====