LoginSignup
1
1

More than 5 years have passed since last update.

explicitを指定した場合のコンストラクタについて

Posted at

引数付きのコンストラクタ(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

となります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1