關於c++中const


      默認情況下,const對象被設定爲僅在文件內有效。當多個文件中出現同名const變量時,其實等同於在不同文件中分別定義了獨立的變量。如果想子多個文件之間共享const對象,必須在變量的定義之前添加extern關鍵字。

const的引用

與普通引用不同,對常量的引用不能被用作修改他所綁定的對象。引用本身即不可更改,所以不存在類似指針頂層與地層const的問題。對const的引用可能引用一個並非const的對象。

const int ci=1024;
const int &r1=ci;   //正確:引用及其對象都是常量
r1=42;              //錯誤:r1是對常量的引用
int &r2=ci;         //錯誤:師徒讓一個非常量引用指向一個常量對象。

指針和const

如果關鍵字const出現在星號左邊,表示被指物是常量;反之,指針自身是常量。

1.指向常量的指針(底層const)不能用於改變其所指對象的值。

const double pi=3.14;//pi不能改變
const double *ptr =&pi//正確
*ptr=42;//錯誤,不能給*ptr賦值。

2.常量指針(頂層const)必須被初始化。當執行對象的拷貝操作時,拷入和考出對象必須具有相同的底層const自個,或者兩個對象數據類型必須能夠轉換。

3.聲明爲constexpr的變量一定是一個常量,而且必須用常量表達式初始化。在constepr聲明中如果定義了一個指針,限定符consteptr僅對指針有效,與指針所指對象無關。

const int *p=nullptr;
constexpr int *q=nullptr;//相當於int * const q=nullptr;
STL迭代器

STL迭代器是以指針爲根據塑模出來的,所以迭代器的作用就像個T*指針。聲明迭代器爲const就想聲明指針爲const一樣(即聲明一個T* const指針),表示這個迭代器不得指向不同的東西,但它所指的東西的值是可以改動的。如果希望STL模擬一個const T*指針,需要的是const_iterator。

vector<int> vec;
const vector<int>::iterator iter=vec.begin();//T* const
*iter=10    //正確
++iter;     //錯誤
vector<int>::const_iterator citer=vec.begin();//const T*
*citer=10; //錯誤
++citer;   //正確

const成員函數

成員函數通過一個名爲this的額外隱式參數來訪問調用它的那個對象。因爲this總是指向“這個”對象,所以this是一個常量指針,我們不允許改變this中的地址。

將const實施於成員函數的目的,是爲了確認該成員函數可作用於const對象身上。常量對象以及常量對象的引用或指針都只能調用常量成員函數。

兩個成員函數如果只是常量性不同,可以被重載。如果只是參數的常量性不同,不可重載。const函數調用non_const不可取。當const和non_const成員函數有着實質等價實現時,令non_const調用const版本可避免代碼重複。

class TextBlock{
public:
……
const char& operator[](size_t position) const{
……
……
return text[position];
}
char& operator[](size_t position){
return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);//先添加const屬性,再移除。
}
……
};




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