タイプ変換およびタイプ変換関数


したがって、タイプ変換は、コンパイラというメモリの一部をどのように解釈し、どのようにこのメモリを組織するかを教えるためです.
1、Cスタイルタイプ変換
c言語はよく知られており、ポインタタイプの変換が一般的です.(type) expressionは、括弧および識別子によって構成される.任意のタイプ間の変換を許可するのはあまりにも乱暴で、プログラム文の中で識別しにくい(主に手動でコードを読むのは見分けにくいかもしれないが、C++文法が複雑であるため).そのためc++は4種類の変換を定義し、上述の欠点を解決した.
2、C++スタイルタイプ変換
フォーマットcast-name(expression)を使用します.1、 static_cast機能は基本的にCスタイルタイプ変換と同様で意味も同じですが、式からconst属性を除去することはできません.
voidf *p;
double *dp = static_cast<double *>(p); 

2、const_castタイプは式のconst属性を変換し、定数オブジェクトを非常量オブジェクトに変換する動作であり、コンパイラはオブジェクトの書き込み操作を阻止しません.
const  char *p;
char *q = const_cast<char *>(p);//  
char *pq = static_cast<char *>(p);//  ,    const_cast  

3、dynamic_castランタイムタイプ識別は、クラスの継承関係に沿って安全にタイプ変換するために使用される.つまり、dynamic_castでベースクラスを指すポインタまたは参照を派生クラスまたはその兄弟クラスを指すポインタまたは参照に変換することができ、変換が成功したかどうかを知ることができます.失敗した変換は、空のポインタ(ポインタをタイプ変換する場合)または例外(参照をタイプ変換する場合)を返します.虚関数が欠けているタイプには使用できません.定数属性を変換するためにも使用できません.
class Widget{};//       
class SpecialWidget:public Widget{};
Widget *pw = new SpecialWidget;
SpecialWidget *psw = dynamic_cast(pw);//  

4、reinterpret_castは通常関数ポインタ間の変換に用いられるが,この変換コードは移植性が悪く,使用しないほうがよい.
typedef void (*FUNPTR)();//      
int doSometing();
FUNPTR funcptr = reinterpret_cast(doSometing);//           ,                ,          。

2、タイプ変換関数
タイプが一致しない場合、C++コンパイラは通常、対応するタイプ変換を行います.
  • 内蔵タイプの暗黙変換、例えばc++はchar暗黙変換int、short暗黙変換doubleなどをサポートし、これらは言語特性によるもので、私たちの制御を受けなければ変更できません.
  • カスタムクラスタイプが一致しない場合、コンパイラはまず暗黙的な変換を考慮しますが、対応する変換関数を呼び出す必要があります.C++は、単一パラメータ構築関数と暗黙型変換演算子の2つの関数を暗黙型変換関数として使用できることを規定している.

  • 単一パラメータコンストラクション関数:1つのパラメータのみで呼び出せるコンストラクション関数です.この関数は、1つのパラメータのみを定義してもよいし、複数のパラメータを定義しているが、最初のパラメータ以降のすべてのパラメータにデフォルト値がある場合でもよい.要するに、コンパイラは対応する関数を呼び出す必要があります.
    class Name {
    public:
        Name(const string& s); 
    };
    void Display(Name a);
    string s("Hello Name");
    Display(s);//         ,  Name          ,    。

    暗黙型変換演算子:関数でもあります.operator type() .
    class Rational {
    public:
    operator double() const; //       ,  Rational  double
    };
    Rational r(1,2);
    double d = 0.5*r;//        r   double

    3、定義型変換関数を避ける
    変換関数を使用する必要がない場合、これらの関数はコンパイラによって呼び出されて実行される可能性があります.その結果、これらの不正なプログラムに問題が発生し、原因を判断できません.
    1、まずタイプ変換演算子を解決し、変換演算子の代わりに文法キーワードを使用しない同等の関数を使用し、コンパイラの自動呼び出しを避けるために、対応する関数を明確に呼び出す.ライブラリ関数のstringタイプには、stringからCスタイルに暗黙的に変換するchar*の機能は含まれず、メンバー関数c_が定義されています.strはこの変換を完了するために使用されます.2、単パラメトリックコンストラクタによる暗黙型変換C++コンパイラによるexplicitキーワードのサポートを解決し、コンパイラが対応するコンストラクタを自動的に呼び出して暗黙変換することを禁止する.しばらくこの方法を理解すればいいので、他の淫らなテクニックは放しましょう.
    template<class T>//    
    class Array {
    public:
        Array(int lowBound, int highBound);//         
        Array(int size);//    ,        
        T& operator[](int index);
        bool operator==( const Array<int>& lhs,const Array<int>& rhs);
    };
    
    Array<int> a(10),b(10);
    
    if(a == b[i])
    {
    
    }
    /*
          ,     。b[i] int  ,a Array  。    operator==  。            int   Array    ,    ,  bug。
      explicit         ,           ,     。
    */