explicitキーワード


原文のリンク:http://blog.csdn.net/fornormandy/article/details/79512
今日会社のコードの中に大量のexplicitキーワードがあるのを見ましたが、旧版のMSDN内の例はまだ完璧ではなく、本当に分かりませんでした.最終的にネット上の文章から答えを見つけました.explicitは陰的なコピー構造関数の使用を防止するためです.以下に新しい版MSDNから見つけた例とネット上の記事を添付します.
//Copy From MSDN
This keyword is a declaration specifer that can only be aplied to in-class construct declarations.An explicit construct cannot part in implicit conversions.It can onlybe to explicit stract.stration.
The follwing program will fail to comple because of the explicit keyword.To relive the error,remove theexplicit keywords and adjust the code in  g.
// spec1_explicit.cpp
// compile with: /EHsc
#include 
  
   
class C 
{
public:
   int i;
   explicit C(const C&)   // an explicit copy constructor
   {
      printf("/nin the copy constructor");
   }
   explicit C(int i )   // an explicit constructor
   {
      printf("/nin the constructor");
   }


   C()
   {
      i = 0;
   }
};

class C2
{
public:
   int i;
   explicit C2(int i )   // an explicit constructor
   {
   }
};

C f(C c)
{   // C2558
   c.i = 2;
   return c;   // first call to copy constructor
}

void f2(C2)
{
}

void g(int i)
{
    f2(i);   // C2558
   // try the following line instead
   // f2(C2(i));
}

int main()
{
   C c, d;
   d = f(c);   // c is copied
}
  
ノート   explicit on a constructor with multile argments hasのeffect、since such construct cannot Tane parte in implicit conversions.However,for the purpose of implicit version,explicit will have and effect if a conversions structures
 
//Copy From Internet Artcle
Pointer
本を読まないと自分のC++がどれぐらい悪いか分かりません.Tさん、explicitを見た時、問題がありました.次の手順を見てください.
クラスA{
public:
A(inti):muui(i){}
int mui;

int main(){
A a=0
a=10;/ここは何の操作ですか?
)
この操作は、一時的なオブジェクトを生成します.
デフォルトの割当演算子「A&operator=(int i){}」であると思いますが、演算子を積載して、確かに重い演算子の関数に実行しました.臨時のオブジェクトはどのように生成されますか?
デフォルトの演算子はこのように動作しますか?
A&operator=(int i){
A a(i)
return a;
)
これは似たような関数操作を思い出させます.
void fn(A){
//…
)
ここで直接fn(10)を書くことができます.また、一時的なオブジェクトが発生しました.
本当ですか?迷いを解く
alexemiux
あなたが使っているのはどのコンパイラですか?私の印象では、標準C++はoperator=を与えないようです.試してみます.
gongmin
もちろんデフォルトのoperator=があります.
c+++の標準でコンパイラは5つのデフォルトのメンバー関数を生成します.
デフォルトのコンストラクタ
コピーコンストラクタ
コンストラクタ
operator=
operator&
 
千里のウマの肝臓
クラスA
{
public:
A(inti):muui(i){}
int mui;

別々に話してください
1.A=0
まず、complerはこのように書くのは規則に合わないと思っています.A=Aこそ正常な行為です.
しかし、彼女はあきらめずに検索したところ、Aは一つのint構造によって、このAはexplicitで修飾されていないことが分かりました.
じゃ、A=0ですこのような言葉はすぐに変わります.
A mp(0)
A a=tmp;
説明したいのは、A a=tmpはコールのcopy ctorで、クラスAにはないですが、copy ctorは通常書かれていません.
complerは、一つのmember wise assigmentの操作性のctorを生成します.一番下の実現は通常memcpyで行われます.
2.a=10
まず、このようにctorの場合と同じで、complerは直接操作できません.
類推はコードと同じです.
A mp(10)
a=tmp;
注意したいのは、a=tmpは呼び出しのassignment操作で、ctorと同じように、私達は自分で書かないで、コンパイラも同じように行います.
member wise assigment操作.
3.fn(A a)
同じように、fn(10)も違いますが、「慣例に従う」ということがあります.
A mp(10)
fn(tmp) 
また、あなたのために迷いを解消します.
copy ctorの書き方はT:Tのみです.
多くの種類のignmentの書き方は変わりやすいです.すなわち任意です.Tを例にとって、 
あります
T&operator=(int n);
あるかもしれません
T&operator=(const char*)
もちろん、このような定義はTにとって意義があることを確認してください.
その後、上記a=tmp、すなわち呼び出しのデフォルト、標準、自動生成のT&operator=(const T&). 
オーバーヘッドは、一時的にA mpを生成し、memcpyです.
T&operator=(int n)を書いたら、a=10はa.m_を意味します.i=10. 
もちろん、オーバーヘッドはT&operator=(int n)がinlineかどうかを見ます.
explicitに対して、explicit A(int i):m_i(i){}では、complerがプライベートであれほど多くの変換動作をしないように教えます.
また、A tmp(0)のようなものが自動的に生成されるのは、私たちが望んでいないので、場合によっては自動的に変換するという行為は間違っています.
最後に、このような問題に関して、もう一つの話題があります.つまり、クラスAはoperatoint()があります.
fn(intn){}
A a(3)
fn(a)
魔術のような役割を果たします.これについては自分で本を見てください.
最後に、C++を学ぶ道中が順調に行くことを祈ります.Good luck~