ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

黙示的なコンストラクタ変換とexplicit

1つの仮引数をとるコンストラクタを持つクラス。

class Test {
    int num;
public:
    Test(int x) { num = x; }
}

オブジェクトの初期化を私は次のように書いている。

Test obj(10);

これを次のように書くこともできる。

Test obj = 10;

これは自動的に上の書き方へと変換される。これが黙示的なコンストラクタ変換。さらに次のような記述もできる。

Test obj(10);

obj = 10;

あたかも変数の代入のように見えるが、これも黙示的な変換が行われている。
この自動的な変換を行われないようにするにはコンストラクタにexplicitを付ける。

class Test {
    int num;
public:
    explicit Test(int x) { num = x; }
};

こうすると自動的な変換が行われないので、Test obj = 10; という書き方はコンパイルエラーとなる。