君はまだ知らないかもしれないcast,static_cast,dynamic_cast,reinterpret_キャストの違いは?

7727 ワード

[QQ群:189191838、アルゴリズムとC++に興味があれば入ってもいい]
冒頭の構想:
C++の中でいろいろな転換は目まぐるしくて、差が多くないように見えて、実際には差が多くて、しかも今の时間、1つの“差が多くない先生”をするのは実はとても難しくて、うっかりして社会に淘汰されるかもしれません.
データ変換(もちろん、さまざまなオブジェクトタイプの変換も含まれています)は、Intをdoubleに変換するなど、よく使われています.人がどんな場面でどんな服を着ているのか、どんなことを言っているのかというと、とても重要なことです.では、どのようなデータオブジェクトに対してどのような変換方式を使うかもvery importantです!本編では、タイトルの4つの変換方法について説明します.
       reinterpret_キャスト直接変換
これはすべての転換の中で最も簡単で乱暴な方法で、1人の男子学生と1人の女子学生が好きで、それから直接地面に倒れて多くの性質が違います.時には効果がよく、スピードが速いが、危険が高く、強姦罪かもしれないので、あまり使われていない.
1     int *m; 2     char *ch=(char*)m; 3     char ch1=reinterpret_cast<char> (m);//          ,     ,    

上のコードを見て、皆さんはその役割を知っていると思います.実際には、変換に成功したと判断しない限り、できるだけ使用しないでください.
      static_cast
コンパイラ内のすべての暗黙的な変換はstatic_で使用できます.castで表示される完了は、一般的に暗黙的な変換のみの場合、static_cast間の変換こそ合法的です.私がここで言ったのは普通で、それは特殊で、特に継承クラスと親クラスの階層の変換で、具体的には後で話します.
では、暗黙的に変換できる以上、なぜ表示する必要があるのかstatic_キャスト変換は?もちろん、プログラムの読みやすさは考慮された要素であり、他にもいくつかの要素があります.
voidポインタを他のタイプのポインタに変換する場合は、変換を表示しなくてもいいでしょう.また、intがcharに変換されるか、charがintに変更されるなど、通常の標準変換を変更する.もちろん、クラス階層内のベースクラスとサブクラス間のポインタまたは参照の変換()もあります.上り変換を行う(サブクラスのポインタまたは参照をベースクラス表示に変換する);下り変換を行う(ベースクラスのポインタまたは参照をサブクラスポインタまたは参照に変換する).
      
 1  class base{  2  public:  3       void print(){  4          cout<<"base"<<endl;  5  }  6  };  7  class child:public base{  8   public:  9      void print(){ 10          cout<<"child"<<endl; 11  } 12  };
1  base *b=new base(); 2     child *c=new child(); 3     b=static_cast<child*>(c);//

4     b->print();
1     base *b=new base(); 2     child *c=new child(); 3     c=static_cast<child*>(b);//

4     b->print();

ここでは特に、下り変換はダイナミックタイプチェックがないため、安全ではありません.そしてdynamic_castは検査を行います.
     dynamic_cast
      dynamic_cast変換のオブジェクトは、クラスのポインタまたは参照、void*でなければなりません.
      dynamic_castは実行時にタイプチェックが行われます.また,この情報はクラスの虚関数数テーブルに格納され,虚関数が存在するクラスのみが虚関数テーブルとなり,虚関数のないクラスを変換するとコンパイルエラーとなる.
やはり上の例です.下に変更すると、下り変換時に親が虚関数を定義していないため、コンパイルエラーが発生します.
1 base *b=new base(); 2     child *c=new child(); 3     c=dynamic_cast<child*>(b);//

4     b->print();

もちろん、上り変換時に効果とstatic_cast<>;同じです.
だからdynamic_castは一般的に多態で上下変換が多い.ポインタタイプに変換に失敗した場合、dynamic_castの結果は0です.参照時に失敗した場合、bad_が投げ出されます.castタイプの異常.
    const_cast
名前の通りconstに関連するように使用されるようです.確かに、彼はremoveやadd式のconstの性質です.
1 int x=9; 2 const int *y=const_cast<int*>(&x);

次はremoveのconstの性質です
1 const int x=9; 2 int *y=const_cast<int*>(&x);

本稿では,4つの表示変換の使い方について基本的に触れ,皆さんの役に立つことを願っている.間違い箇所はご指摘ください.どうもありがとうございません.
 
参考文献:http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast
                http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used
                http://blog.csdn.net/bzhxuexi/article/details/17021559
 
転載は出典を明記してください:http://www.cnblogs.com/xiaoyi115/p/3629696.html