Explicitキーワード

5656 ワード

正直、今までこのキーワードが役に立つとは思わなかった.
explicitの意味は明らかで、それに対応する語はimplicitの意味が隠されている.
MSDNと「c++標準ライブラリ」のこのキーワードの説明を参照し、ネットワーク上のこのキーワードの解釈を参照しました.次に、その使用方法と要約を以下に記録します.
まず、このキーワードはクラス構築関数でしか使用できません.暗黙的な変換ができない役割を果たします.
class gxgExplicit  //     explicit  
{
public:
   int _size;

   gxgExplicit(int size)
   {
      _size = size;
   }
};

次は呼び出しです
   gxgExplicit gE1(24);//これで大丈夫
   gxgExplicit gE2 = 1;//それも問題ない
   gxgExplicit gE3;//それはいけません.デフォルトのコンストラクタはありません
   gE1 = 2;//それも問題ない
   gE2 = 3;//それも問題ない
   gE2 = gE1;//それも問題ない
 
しかしgxgExplicitをStackに変更すると、私たちの_sizeはスタックの大きさを表しており、呼び出された2番目の文は不倫しており、疑問に思われやすい.これは、コードの読み手に理解してもらう形式ではありません.合法的ですが(コンパイラはコンパイルできます).これは、コンパイラがデフォルトで暗黙的に変換する機能があるため、gE 2=1を入力すると最初の文と同じ結果にコンパイルされます.そのため、explicitが役に立ちます.コードを修正するには:
class gxgExplicit
{
public:
   int _size;
   explicit gxgExplicit(int size)
   {
      _size = size;
   }
};

上の呼び出しを続行します.
   gxgExplicit gE1(24);//これで大丈夫
   gxgExplicit gE2 = 1;//それはいけません.キーワードは暗黙的な変換をキャンセルしました
   gxgExplicit gE3;//それはいけません.デフォルトのコンストラクタはありません
   gE1 = 2;//それはいけません.キーワードは暗黙的な変換をキャンセルしました
   gE2 = 3;//それはいけません.キーワードは暗黙的な変換をキャンセルしました
   gE2 = gE1;//これではだめです.クラスがオペレータ「=」の再ロードを実現しない限り、キーワードは暗黙的に変換されません.
これはコンパイラ(vs 2005)表示:cannot convert from'int'to'gxgExplicit'です.
ここからも,このキーワードの役割はコンパイラの暗黙的な変換機能を遮断することであることがわかる.
MSDNには、コンストラクション関数パラメータが2つを超えると自動的に暗黙的な変換がキャンセルされるという事実が記述されている.たとえば
class gxgExplicit
{
private:
   int _size;
   int _age;
public:

   explicit gxgExplicit(int age, int size)
   {
      _age = age;
      _size = size;
   }
};

 
これはキーワードの効果があるかどうかと同じです.それはこのキーワードがあることに相当します.
ただし、別の場合は例外です.入力する必要があるパラメータは1つしかありません.残りはデフォルト値のあるパラメータです.
class gxgExplicit
{
private:
   int _size;
   int _age;
public:
   explicit gxgExplicit(int age, int size = 0)
   {
      _age = age;
      _size = size;
   }
};

class gxgExplicit
{
private:
   int _size;
   int _age;
int _hight;

public:

   explicit gxgExplicit(int age, int size = 0, int hight = 0)
   {
      _age = age;
      _size = size;
      _hight = hight;
   }
};

 
この場合は1つのパラメータの効果に相当します.今まで.このキーワードはこのように使われています.参照先:http://blog.csdn.net/callmeback/article/details/4039304
--------------------------------------------------------
しかし、gxgExplicit gE 2=gE 1というエラーがあるようです.まあまあです.暗黙的な変換ではなく、コピーコンストラクション関数を使用しているからです.上記のコンパイルが通じないのは、第2の文のコンパイルが通じないためで、gE 2はまったく存在しません.もちろんgE 2=gE 1です.コンパイルが通じない.