C ++でのconstの使用法



1、

constは通常の変数を変更します


constは変数を変更します。つまり、変数は定数であり、変更できません
const int x; // xは整数定数
const double x; // xはdouble定数です

constがポインターを変更する場合:
const int * x; // xは定数整数へのポインター
int * const x; // xは定数ポインターです。
const int * const x; // xは定数ポインターであり、定数
x も指します。*の右側は定数ポインターを意味し、*の左側は定数を意味します。


STLのイテレータはポインタでモデル化されているため、イテレータの役割はT *と同様です。
イテレータを装飾するためにconstを使用する場合:
const vector <int> :: iteator it; //これは定数イテレータであり、このイテレータへのポインタは変更できませんが、このイテレータが指す値は変更できます。

次のように、イテレーターが指すものを変更できない場合:
vector <int> :: const_iterator it;


2、

const変更された関数パラメーター
 

<span style="font-size:14px;">int &fun(const int x);</span>
<span style="font-size:14px;"></span>

<span style="font-size:14px;">函数的形参是一个普通的const变量:
    1、 如果函数返回值一个non-const引用 , 那么就不能返回 x;
    2、 x 的值在函数中不能被改变 , 非常量指针不能指向它 , 非常量引用也不能引用该变量。</span>


<span style="font-size:14px;">int &fun(const int x)
{
    int *z = &x;    //错误的
    int *const z1 = &x;    //错误的,因为z1不是一个指向常量的指针
    const int *z2 = &x      //正确的
    int &z3 = x;        //错误的, 因为z3不是一个常量引用
    const int &z4 = x;       //正确的
    
    return x;  //错误的 , 不是一个常量引用
}</span>

仮パラメーターがconstポインターまたはconst参照の場合、上記の通常の定数変数の使用法と同じです。

3. const変更されたメンバー関数

    注:constで変更できるのはメンバー関数のみで、他の関数はconstで変更できません。
const変更メンバー関数に関する注意点:
     1. constメンバー関数では、クラス内のすべての変数にconst属性が含まれ、ポインターのconst属性は、ポインター自体が定数ポインターであることを意味します。
     2.したがって、constメンバー関数では、非const参照および非constポインターは使用できず、クラス内の変数(参照ポインターが指す値を除く)
     3. constのみが異なる2つのメンバー関数をオーバーロードできます。の。

<span style="font-size:14px;">class xy
{
public:
    xy():z(new char[10])  {}
    xy(char *new_z)
    {
        int n = strlen(new_z);
        z = new char[n+1];
        strcpy(z , new_z);
    }
    const char &operator [](int si) const;
    char &operator [](int si);

private:
    char *z;
    int x;
    double y[10];
};

const char &xy::operator[](int si) const
{

    cout<<"const"<<endl;
    return *(z+si);
}

char &xy::operator[](int si)
{
    cout<<"no-const"<<endl;
    return const_cast<char &>(
        static_cast<const xy&>(*this)[si]
    );
}
</span>


クラスには、2つの関数がconst属性によってオーバーロードされることがよくあります。これら2つの関数が同じ関数を持っている場合、コードの重複を避けるために
、上記の例のように、非constバージョンの関数に関数のconstバージョンを呼び出させることがよくあります。演算子[]が機能します。

現時点では、const_castとstatic_castの2種類の強制遷移を使用する必要があります。

   const_cast:変数のconst属性を削除します。
   const int x;
   int&y = const_cast <int&>(x);
   static_cast:通常の変数間の強制変換、const属性を変数に追加
   int x;
   double y = static_cast <double>(x);


190件の元の記事を公開 19件の賞賛 200,000回以上の閲覧

おすすめ

転載: blog.csdn.net/zengchenacmer/article/details/38533221