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