C++explicitキーワードと暗黙型変換

1802 ワード

C++explicitキーワードはクラス内のコンストラクション関数の宣言にのみ使用でき、「単一パラメータのコンストラクション関数」または「複数のパラメータがあるが、他のパラメータにはデフォルト値があり、デフォルト値のないコンストラクション関数が1つしかない」という機能しかありません.修飾されたコンストラクション関数を使用してオブジェクトを定義する場合、対応する暗黙的なタイプ変換は発生しません.
暗黙型変換
C++では、クラスに1つのパラメータしかないコンストラクション関数の場合、C++はクラス変数を特別に宣言する方法を許可します.この場合、コンストラクション関数パラメータタイプに対応するデータを直接クラス変数に割り当てることができ、コンパイラはコンパイル時に自動的にタイプ変換を行い、コンストラクション関数パラメータタイプに対応するデータをクラスのオブジェクトに変換します.次の例を示します.
class People 
{ 
public: 
    int age; 
    People (int a)  {  age=a;  } 
};

void foo ( void ) 
{   
    People p1(10);  //     
    People* p_p2=new People(10); //     
    People p3=10; //    
}

この例では、方式1と方式2は、通常のプログラミングでよく使われるオブジェクト定義方式であるが、方式3は特殊な方式である.C/C++は強いタイプの言語であり、異なるデータ型は勝手に変換できないため、タイプ変換を行うには、強制タイプ変換を表示しなければならないが、ここでは、表示の変換は一切行われていない.整形データをクラス変数p 3に直接付与する.したがって,方式3では暗黙的なタイプ変換が行われ,コンパイラは構造関数パラメータタイプに対応するデータを自動的にクラスのオブジェクトに変換するので,方式3はコンパイラによって自動的に変換され,方式1の最終的な実現方式と同じであるといえる.
explicitキーワード
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キーワードは、次のようなパラメータの構築関数にのみ使用されます.
  • constructor(typename value);
  • construcor(typename value1,typename value2=defaultvalue,typename value3=defaultvalue,...) ;

  • 2つのパラメータの構造関数は暗黙的な変換がほとんどできないため,classtype classname=valueが現れない.
    参考記事
    1.CSDN|cbNotes|cbNotesのコラム:千里|C++キーワードexplicitの詳細と使用に至るまで、一歩も積み重ねない