引き数を 1 つだけ使用し、explicit
キーワードを使用せずに宣言されたコンストラクターは、変換コンストラクターです。
代入演算子を使用して、変換コンストラクターでオブジェクトを構成できます。
explicit キーワードを使用してこの型のコンストラクターを宣言すると、この振る舞いを防ぎます。
明示的キーワードは、望ましくない暗黙的型変換を制御します。
それは、クラス宣言内のコンストラクターの宣言にだけ使用されます。
例えば、デフォルトのコンストラクターを除いて、
以下のクラスのコンストラクターは、変換コンストラクターです。
class A { public: A(); A(int); A(const char*, int = 0); };
以下の宣言は、正しい宣言です。
A c = 1; A d = "Venditti";
最初の宣言は A c = A(1) に等価です。
explicit キーワードを使用してこのクラスのコンストラクターを宣言すると、 前の宣言は正しくなくなります。
例えば、クラスを以下のようなクラスとして宣言する場合、
class A { public: explicit A(); explicit A(int); explicit A(const char*, int = 0); };
クラス型の値に一致する値だけを代入できます。
例えば、以下のステートメントは正しくありません。
A a1; A a2 = A(1); A a3(1); A a4 = A("Venditti"); A* p = new A(1); A a5 = (A)1; A a6 = static_cast<A>(1);
関連参照