「型変換」の版間の差分

削除された内容 追加された内容
Hsz (会話 | 投稿記録)
編集の要約なし
1行目:
'''型変換'''('''かたへんかん''')とは[[プログラミング (コンピュータ)|プログラミング]]において、ある[[データ型]]の実体を他のデータ型として参照することである。必要応じて行われる'''暗黙の型変換'''と[[プログラマ]]が変換することを指示して行われる'''明示的変換'''の2つに大きく分けられである。
 
==分類==
== =暗黙の型変換 と明示的型変換===
暗黙の型変換はコンパイラによって自動的に行われる型変換である。たとえばある式の中に複数の型のオブジェクトが存在する場合、全てのオブジェクトを最も上位の型に変換することになる。
'''暗黙の型変換'''は明示的に指定しなくてもコンパイラの判断によって自動的に行われる型変換である。逆に、明示的に指定して行う型変換を'''明示的型変換'''という。
 
暗黙の型変換はコンパイラによって自動的に行われる型変換である。たとえばある式の中に複数の型のオブジェクトが存在する場合、全てのオブジェクトを最も上位の型に変換することになる。
double d;
long l;
14 ⟶ 17行目:
暗黙の型変換には注意しなければならないこともある。たとえば<code>double</code>型([[浮動小数点数]])の値を<code>int</code>型([[整数型]])の変数へ代入するという場合、小数点以下の値が存在したり、元の値が<code>int</code>型で表現できる範囲を超えていたりする場合は情報の一部が失われてしまうことになる。(C言語ではそのような変換を許している)
 
== 明示的=組み込みの型変換 とユーザ定義の型変換===
基本的な型変換(整数同士の変換や、整数⇔浮動小数点数の変換など)は、多くの処理系でコンパイラもしくはプロセッサ内に既に定義されている。一方、ある型から別の型への変換をユーザが定義できる言語もある。
{{節stub}}
 
例えば[[C++]]では、ユーザ定義型の中に変換先の型を一つだけとる[[コンストラクタ]]を定義すれば、ユーザ定義の暗黙の型変換が定義される。コンストラクタに<tt>explicit</tt>修飾子をつけると暗黙の型変換が許可されず、明示的型変換となる。
 
class Class1 { };
class Class2 {
public:
explicit Class2(Class1 c1) { }
};
void test() {
Class1 c1;
Class2 c2 = (Class2)c1;
// explicit修飾子がなければ Class2 c2 = c1; でよい
}
ここで、<tt>Class1</tt>と<tt>Class2</tt>の間は継承関係がないにも関わらず代入ができている。これは<tt>Class1</tt>からコンストラクタを通して<tt>Class2</tt>に型変換されたためである。
===機能による分類===
====アップキャスト====
あるクラス<tt>Base</tt>と、<tt>Base</tt>から派生したクラス<tt>Derived</tt>があるとする。アップキャストとは、派生クラスから基底クラスへの型変換、すなわち<tt>Derived</tt>のインスタンスを<tt>Base</tt>に変換する操作である。「<tt>Derived</tt>のインスタンスは<tt>Base</tt>のインスタンスである」ことは保証されているので、この変換は安全である。そのため、多くの言語においてこれは暗黙に行うことができる。
====ダウンキャスト====
ダウンキャストはアップキャストの逆で、基底クラスから派生クラスへの型変換、すなわち<tt>Base</tt>のインスタンスを<tt>Derived</tt>に変換する操作である。<tt>Base</tt>のインスタンスは必ずしも<tt>Derived</tt>のインスタンスとは限らないので、この変換は一般に安全ではなく、エラーが発生する可能性がある。そのため、多くの言語では明示的な構文が必要である。
 
[[C++]]においてはダウンキャストのために<tt>dynamic_cast</tt>という特別な構文が用意されている。この構文では、変換が失敗すると結果として[[ヌル (コンピュータ)|NULL]]</tt>が返る。
====静的キャスト====
整数同士の型変換や整数と浮動小数点数の間の型変換などの、ごく一般的な型変換。
 
== 関連項目 ==
* [[型システム]]
 
{{comp-stub}}
[[Category:データ型|かたへんかん]]
[[Category:プログラミング言語の構文|かたへんかん]]