explicitコンストラクション関数

4533 ワード

デフォルトでは、1つのパラメータのみのコンストラクション関数も暗黙的な変換を定義し、次のようにデータ型に対応するデータをクラスオブジェクトに変換します.
class String {

String ( const char* p ); //  C      p      

//

}

String s1 = “hello”; //OK     ,   String s1 = String(“hello”);

 
しかし、このような暗黙的な変換は必要ない場合があります.以下のようにします.
class String {

       String ( int n ); //       n       

String ( const char* p ); //  C      p      

//

}

 
次の2つの書き方は普通です.
String s2 ( 10 );   //OK   10        

String s3 = String ( 10 ); //OK   10        

 
次の2つの書き方は疑問です.
String s4 = 10; //    ,    10        

String s5 = ‘a’; //    ,  int(‘a’)        

 
s 4とs 5はそれぞれint型とchar型を暗黙的にいくつかのバイトを割り当てる空の文字列に変換し,誤解されやすい.
このようなエラーを回避するために、表示された変換を宣言し、使用することができます.
explicitキーワード:
class String {

       explicit String ( int n ); //       n       

String ( const char* p ); //  C      p      

//

}

に加える
explicit
String(int n)の暗黙的な変換を抑制し、
 
次の2つの書き方は正しいです.
String s2 ( 10 );   //OK   10        

String s3 = String ( 10 ); //OK   10        

 
次の2つの書き方は許されません.
String s4 = 10; //

String s5 = ‘a’; //

 
だから、ある時、
explicitは構造関数の暗黙的な変換による誤りや誤解を効果的に防止することができる.
----------------------------------------------------------
explicitは、暗黙的な変換を抑制するために構造関数にのみ機能します.次のようになります.
  class   A   {   

          A(int   a);   

  };   

  int   Function(A   a);   

    

Function(2)が呼び出されると、2は暗黙的にAタイプに変換されます.このような状況はプログラマーが望んでいる結果ではないことが多いので、避けるには、このように書くことができます.
    
  class   A   {   

          explicit   A(int   a);   

  };   

  int   Function(A   a);   

    

これにより、Function(2)が呼び出されると、コンパイラは、(Functionがintをパラメータとするリロード形式を持っていない限り)エラーメッセージを与え、プログラマが知らないうちにエラーが発生することを回避することができる.
まとめ:explicitは構造関数にのみ作用し、暗黙的な変換を抑制します.