組み込みの型変換とユーザー定義の型変換
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/06/07 23:27 UTC 版)
「型変換」の記事における「組み込みの型変換とユーザー定義の型変換」の解説
基本的な型変換(整数どうしの変換や、整数と浮動小数点数との間の変換など)は、多くのプログラミング言語処理系で最初から定義されており、通例プロセッサ (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を指定しない場合は変換コンストラクタとなることができる。
※この「組み込みの型変換とユーザー定義の型変換」の解説は、「型変換」の解説の一部です。
「組み込みの型変換とユーザー定義の型変換」を含む「型変換」の記事については、「型変換」の概要を参照ください。
- 組み込みの型変換とユーザー定義の型変換のページへのリンク