この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
出典検索?: "型変換"
型変換(かたへんかん、英: 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言語のコードでは、dとlとiは異なったデータ型をもっているので、すべての演算は自動的に同じ型に変換された後に行われる。より大きなサイズの型に変換されることを拡大変換 (widening conversion) と呼び、より小さなサイズの型に変換されることを縮小変換 (narrowing conversion) と呼ぶ。 暗黙の型変換には注意しなければならないこともある。たとえばdouble型(浮動小数点数)の値をint型(整数型)の変数に代入する場合、小数点以下の端数があったり、元の値がint型で表現できる範囲を超えていたりすると、縮小変換により情報の一部が失われてしまう。浮動小数点数特有の誤差により、意図せず切り捨てられてしまうこともありうる。また、符号付き整数と符号無し整数との間の暗黙変換に関しても、同様に情報が失われたり、整数オーバーフローにより意図しない値になってしまったりする可能性がある。C言語およびC++では暗黙の縮小変換を許しているが、情報が失われる可能性のある変換に対して、通例コンパイラが警告を出す。JavaやC#などの後発言語では、暗黙の縮小変換を許可せず、後述するキャスト (cast) 構文による明示的な変換が必要となる。さらに型の扱いが厳密なF#などの関数型言語では、暗黙の拡大変換も許可せず、キャスト構文による明示的な型変換が必要となる。 基本的な型変換(整数どうしの変換や、整数と浮動小数点数との間の変換など)は、多くのプログラミング言語処理系で最初から定義されており、通例プロセッサ (CPU) によってサポートされる高速なハードウェア変換命令にコンパイルされる。一方、ある型から別の型への変換をユーザーが定義できる言語もある。 例えばC++では、ユーザー定義型の中に変換元の型を一つだけとる引数付きコンストラクタを定義すれば、ユーザー定義の暗黙の型変換が定義できる。これを変換コンストラクタ (converting constructor) と呼ぶ。コンストラクタにexplicit修飾子をつけると暗黙の型変換が許されなくなり、明示的型変換が必要となる。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); と書くことは常にできる。} ここで、Class1とClass2の間には継承関係がないにもかかわらず代入ができている。これはClass1からコンストラクタを通してClass2に型変換されるからである。 なお、上の例では型変換の構文をとってはいるが、実際の処理としてはc1はコンストラクタへの引数として渡されている。そのため、本来必要のないc1のコピーが生成される。これを避けるために、変換元の型がユーザー定義型である場合には、通常は引数を参照として渡す。また、型変換という操作の意味を考えれば、変換元のインスタンスに変更を加えるということはあり得ないので、通常は引数にconst修飾子をつけて変更不可とする。結局、コンストラクタの宣言はexplicit Class2(const Class1& c1) { ... } のように書くことが多い。 なお、C++11以降では複数の引数を持つコンストラクタであっても、explicitを指定しない場合は変換コンストラクタとなることができる[4]。
分類
暗黙の型変換と明示的型変換
組み込みの型変換とユーザー定義の型変換