BohYoh.comトップページへ
C & C++ FAQ
目次

C++ 明示的コンストラクタとは何ですか。

 1個の引数だけで呼び出せるコンストラクタは、暗黙の型変換を行う働きをもつことになります。たとえば、

complex z = 10; // zをcomplex(10)で初期化

では『int型→complex型』の変換が行われるわけです。
 しかし、このような暗黙の型変換が常に好ましいわけでありません。以下の例を考えてみましょう。

class IntArray { int* v; int sz; public: IntArray(int) { /* ... */ } // ... }; int main(void) { IntArray x = 5; // OK IntArray y(5); // OK //... return (0); }

 xもyも要素数が5である配列として生成されることになりますが、xの宣言は、『int型の値5をIntArray型に変換する』ことを指示しているようにもみえます。これは、私たちの直感にはそぐわないものです。
 コンストラクタの宣言に関数指定子explicitを付けて明示的コンストラクタにすると、xの形式による宣言は不可能となります。以下に例を示します。

class IntArray { int* v; int sz; public: explicit IntArray(int) { /* ... */ } // ... }; int main(void) { IntArray x = 5; // エラー IntArray y(5); // OK //... return (0); }



■ 根拠 ■
標準C++ 1st §12.3.1 Conversion by constructor
標準C++ 2nd §12.3.1 Conversion by constructor

戻る

BohYoh.comロゴ