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;           //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成員函數中 , 不能non-const引用和non-const指向 ,類中的變量(除引用指針所指的值)
     3、 兩個成員函數如果只是常量性不同,是可以被重載的。

<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>


在類中 , 經常出現通過const屬性重載的兩個函數,如果這兩個函數功能完全一樣,那麼我們爲了避免代碼重複,往往都會讓non-const 版本的函數去調用 const版本的函數
如上面例子中的 operator[] 函數。

這個時候就要用到const_cast 和static_cast兩個強制轉行的類型

   const_cast:去除變量的const屬性。
   const int x;
   int &y = const_cast<int &>(x);
   static_cast: 普通變量之間的強制轉換、給一個變量添加上const 屬性
   int x;
   double y = static_cast<double>(x);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章