引数付きのコンストラクタ(conversion constructor)が定義されている場合explicitを指定しない場合は暗黙的な変換が適用されます。
例を見た方が分かり易いので、ますはexplicitを指定していないクラスAの場合、
class A{
public:
//default constructor
A(){
printf("A default constructor");
}
//conversion constructor
A(int val1){
printf("A conversion constructor val1=%d",val1);
}
};
というAクラスがあった場合に
A a = 1;
は暗黙的に
A a(1);
と変換されます。
explicitを指定したクラスB
class B{
public:
//default constructor
explicit B(){
printf("B default constructor\n");
}
//conversion constructor
explicit B(int val1){
printf("B conversion constructor val1=%d\n",val1);
}
};
の場合
B b = 1;
はエラーになります。
//conversion constructor
explicit B(int val1){
printf("B conversion constructor val1=%d\n",val1);
}
がexplicit指定されているので暗黙的な変換が行えない為です。
B b = (B)1;
は明示的に変換を行っているのでOKです。あと関数の引数にA,Bを渡す時も
void testA(A a){
}
void testB(B b){
}
testA(a1);
testA(1);
testB(b1);
//testB(1); error
となります。