ぼく用あれこれまとめ

explicit

最終更新:

bokuyo

- view
管理者のみ編集可

explicit

  • C++の予約語でコンストラクタの宣言の前でよく付けられてるのを見かける

カーゴカルト的だけど

  • とにかく引数1個のコンストラクタだったらexplicitを付けておけばなんか変な挙動を起こすことはないはず。
  • explicitをつけるときよりかは、つけないときを考えた方がよさそう。

暗黙のコンストラクタを呼び出さないようにする。

  • (2011/12/02)
    • (注意)ここのところ憶測で書いてるところが多いので、誤ったことを書いてるかもしれません。
    • (注意)ソースコードを載せてますが、コンパイルして試したわけじゃないのでかなり不安です。
      class Unco
      {
        int x;
      public: 
        Unco(int x) : x(x) {}
      };
      
      void PrintUnco( const Unco & unco )
      {
        //ここで何かの処理...
      }
      
  • 上の場合、PrintUnco は以下の引数をとることができる。
    PrintUnco( Unco(3) ); // OK
     
    Unco unco(2);
    PrintUnco( unco ); // OK
     
    int num(4);
    PrintUnco(num); // OK
     
    PrintUnco( 3 ); // OK
    
  • PrintUnco が取れる引数は Unco 型のconst 参照だが、上の場合だとint 型を引数に取ることができる。
    • Unco のコンストラクタUnco::Unco でint を引数に取っているからである。
    • つもり、暗黙的にコンストラクタが呼び出されているのだ!!!!
  • こういった状況を防ぎたい場合、つまり明示的にコンストラクタを呼び出させたいときにexplicit を付ける。
    class Unco
    {
      int x;
    public: 
      explicit Unco(int x) : x(x) {}
    };
    
  • explicit をつけたことで、PrintUnco はコンストラクタを暗黙的に呼び出すことはない。
    int num(4);
    PrintUnco(num); // error
    
    Unco unco(2);
    PrintUnco( unco ); // OK
    
    PrintUnco( 3 ); // error
    
    PrintUnco( Unco(3) ); // OK - 明示的にコンストラクタを呼び出している
    
  • 2引数以上をとるコンストラクタでexplicit を付けることがほとんどないのはどうしてか?
    class Unco
    {
      int x, y;
    public: 
      Unco(int x, int y) : x(x), y(y) {}
    };
    
    void PrintUnco( const Unco & unco )
    {
      //ここで何かの処理...
    }
    
  • 2引数以上のコンストラクタを暗黙的に呼び出そうと、PrintUnco に次のような引数を与える。
    PrintUnco(2, 5); // これはerror
    
  • PrintUnco は1引数しかとれないので、エラーとなる。明示的に書かなければならない。
    PrintUnco( Unco(2, 5) );
    
  • 2引数以上のコンストラクタだと、暗黙的にコンストラクタが呼び出される状況は考えにくい。
  • 1引数のコンストラクタに関して、explicit キーワードを付けるのははじめのほうに挙げた状況を防ぐためである。
記事メニュー
目安箱バナー