c++のconst/const_cast

3967 ワード

  • const修飾一般変数
  • const double PI = 3.14159f;
  • const修飾ポインタ変数
  • double const *pPi = Π
  • const修飾ポインタ変数が指す変数
  • const double *pPi = Π
  • const修飾クラスメンバー属性
  • const修飾クラスメンバー関数、constメンバー関数内部ではconst修飾以外のメンバー関数を呼び出すことはできませんが、変更せずにconst以外のクラスメンバー属性
  • を呼び出すことができます.
    float PI = 2.14;
    
    float getPi()
    {
        PI += 1;
        return PI;
    }
    
    class CA
    {
    private:
        const int a;
        int b;
    
    public:
        CA() :a(1), b(2) {}
    
        int getA() const
        {
            // b++; // const       const     
            int c = a+b; // const      const     
    
            getPi(); // const          const  
    
            return a;
        }
    
        void  getCA() // const // const         const     
        {
            getA();
            getB();
        }
    
        int getB()
        {
            // a++;
            b += 2;
            return b;
        }
    
    };
    
    void test()
    {
        CA ca;
        cout << "ca.getA() : " << ca.getA() << endl;
        cout << "ca.getB() : " << ca.getB() << endl;
    }
  • const_castの使用:このコードはWorking Draft,Standard for Programming Language C++N 4582
  • から抜粋する
    int i = 2; // not cv-qualified
    const int* cip; // pointer to const int
    cip = &i; // OK: cv-qualified access path to unqualified
    *cip = 4; // ill-formed: attempt to modify through ptr to const
    int* ip;
    ip = const_cast<int*>(cip); // cast needed to convert const int* to int*
    *ip = 4; // defined: *ip points to i, a non-const object
    const int* ciq = new const int (3); // initialized as required
    int* iq = const_cast<int*>(ciq); // cast required
    *iq = 4; // undefined: modifies a const object

    構造の良いコードはconst_を使用する必要はありません.castの.エラーを使用してもコンパイルエラーが報告されない場合、コンパイラに関連する未定義の実行エラーが発生し、非常に危険です.