型変換
基本的な型変換(整数どうしの変換や、整数と浮動小数点数との間の変換など)は、多くのプログラミング言語処理系で最初から定義されており、通例プロセッサ (CPU) によってサポートされる高速なハードウェア変換命令にコンパイルされる。一方、ある型から別の型への変換をユーザーが定義できる言語もある。
例えばC++では、ユーザー定義型の中に変換元の型を一つだけとる引数付きコンストラクタを定義すれば、ユーザー定義の暗黙の型変換が定義できる。これを変換コンストラクタ (converting constructor) と呼ぶ。コンストラクタにexplicit修飾子をつけると暗黙の型変換が許されなくなり、明示的型変換が必要となる。
ここで、Class1とClass2の間には継承関係がないにもかかわらず代入ができている。これはClass1からコンストラクタを通してClass2に型変換されるからである。
なお、上の例では型変換の構文をとってはいるが、実際の処理としてはc1はコンストラクタへの引数として渡されている。そのため、本来必要のないc1のコピーが生成される。これを避けるために、変換元の型がユーザー定義型である場合には、通常は引数を参照として渡す。また、型変換という操作の意味を考えれば、変換元のインスタンスに変更を加えるということはあり得ないので、通常は引数にconst修飾子をつけて変更不可とする。結局、コンストラクタの宣言はexplicit Class2(const Class1& c1) { ... } のように書くことが多い。
なお、C++11以降では複数の引数を持つコンストラクタであっても、explicitを指定しない場合は変換コンストラクタとなることができる。