型変換型変換(かたへんかん、英: type conversion)とはプログラムにおいて、あるデータ型を他のデータ型に変換することである[1]。型キャスト(英: type casting)とも呼ばれる[2]。 分類暗黙の型変換と明示的型変換暗黙の型変換は、明示的に指定しなくてもコンパイラの判断によって自動的に行われる型変換で、型強制(type coercion)ともいう[3]。逆に、明示的に指定して行う型変換を明示的型変換という。 暗黙の型変換では、たとえばある式の中に複数の型の変数がある場合、すべての変数を最も上位の型に変換する。 double d;
long l;
int i;
/* ... */
if (d > i) d = i;
if (i > l) l = i;
if (d == l) d *= 2;
このC言語のコードでは、 暗黙の型変換には注意しなければならないこともある。たとえば 組み込みの型変換とユーザー定義の型変換基本的な型変換(整数どうしの変換や、整数と浮動小数点数との間の変換など)は、多くのプログラミング言語処理系で最初から定義されており、通例プロセッサ (CPU) によってサポートされる高速なハードウェア変換命令にコンパイルされる。一方、ある型から別の型への変換をユーザーが定義できる言語もある。 例えばC++では、ユーザー定義型の中に変換元の型を一つだけとる引数付きコンストラクタを定義すれば、ユーザー定義の暗黙の型変換が定義できる。これを変換コンストラクタ (converting constructor) と呼ぶ。コンストラクタに class Class1 { };
class Class2 {
public:
explicit Class2(Class1 c1) { /* ... */ }
};
void test() {
Class1 c1;
Class2 c2 = (Class2)c1;
// explicit 修飾子がなければ Class2 c2 = c1; でよい。
// explicit の有無にかかわらず、Class2 c2(c1); と書くことは常にできる。
}
ここで、 なお、上の例では型変換の構文をとってはいるが、実際の処理としては なお、C++11以降では複数の引数を持つコンストラクタであっても、 キャストとその分類C言語とその流れにある言語では、キャスト演算子によるキャスト式により、式の右辺値を指定された型に型変換する。この構文をキャストと呼ぶ。C言語のキャスト演算子は、型名を括弧で囲んだ形式 double d = 1234.5678;
int x = (int)d;
C++では従来のC言語形式のキャスト構文のほか、用途および意味を明確にした4つの異なるキャスト構文( アップキャストあるクラスBaseと、Baseから派生したクラスDerivedがあるとする。アップキャストとは、派生クラスから基底クラスへの型変換、すなわちDerivedのインスタンスをBaseに変換する操作である。「DerivedのインスタンスはBaseのインスタンスである」ことは保証されているので、この変換は安全である。そのため、多くの言語において、アップキャストは暗黙的に行うことができる(リスコフの置換原則)。例外として、F#は暗黙変換を許可しない言語であり、インターフェイス(抽象基底クラス)のメソッドはそのインターフェイスを実装したクラス(派生クラス)のインスタンスから直接呼び出すことができず、まずインターフェイス型への明示的なアップキャストが必要となる[5]。 ダウンキャストダウンキャストはアップキャストの逆で、基底クラスから派生クラスへの型変換、すなわちBaseのインスタンスをDerivedに変換する操作である。Baseのインスタンスは必ずしもDerivedのインスタンスとは限らないので、この変換は一般に安全ではなく、エラーが発生する可能性がある。そのため、多くの言語ではキャスト構文による明示的な変換の記述が必要である。通例、オブジェクト指向プログラミングではポリモーフィズムを使うべきであり、ダウンキャストおよびクロスキャストが必要になるということはプログラムの設計に問題があることを示唆している。 C++では、安全なダウンキャストのために Javaでは、ダウンキャストに失敗すると C#では、ダウンキャストに失敗すると クロスキャストあるクラスDerivedが、二つの基底クラスBase1とBase2を多重継承しているとする。このとき、例えばBase1からBase2のように基底クラスどうしの間で型変換することをクロスキャストという。変換する対象がDerivedのインスタンスであればキャストは成功するが、それは実行時にならないと分からないので、ダウンキャストと同様に安全な型変換ではない。 C++では、ダウンキャストと同じ構文 C++/CLIおよびC++/CXではそれぞれ、 静的キャスト整数どうしの型変換や整数と浮動小数点数との間の型変換などの、ごく一般的な型変換。内部的には64bitで表すデータを32bitなどに変換する縮小変換や、32bitで表すデータを64bitなどに変換する拡大変換を伴う場合もある。一例としては、JavaやC#の 脚注
関連項目 |