const表示其所修飾的對象不能夠被改變,例如常量,函數,指針等,下面總結一下常見的幾條const用法:
1 指針常量與常量指針:這兩個概念很容易搞混淆,筆者每次用到這兩個概念的時候都要從新查一下文檔才放心,查看定義與實例的時候,很容易理解兩者的意義與區別,時間一長,概念又模糊了。這裏介紹一個簡單的記法,這個方法<<Effective C++>>第三版中看到的:
常量指針,即指向常量的指針,故名思議,指針指向的對象是常量,能夠改變指針自己的值,不能夠改變指針指向的對象的值,定義常量指針的時候,const關鍵字應出如今星號的左邊,例如:函數
int a = 10; int b = 20; int const * p = &a; //常量指針,const在星號左邊 *p = 20; //error 不能經過解引用來修改指針指向的對象的值 p = &b; //ok 能夠改變指針自己的值
定義常量指針的時候,const既能夠出如今類型的左邊,也能夠出如今類型的右邊,例以下面兩種寫法是等價的:spa
const int * p1; //const在int的左邊 int const * p2; //const在int的右邊
指針常量,即指針自己是常量,即指針自己的値不能夠被改變,但指針指向的對象的值能夠改變,定義指針常量的時候,const關鍵字出如今星號的右邊,例如:指針
int a = 10; int b = 20; int * const p = &a; //指針常量,const在星號右邊 *p = 20; //ok 指針指向的對象的值能夠改變 p = &b; //error 指針自己的值不能夠改變
2 聲明迭代器爲const和const迭代器:聲明迭代器爲const就像聲明指針爲const同樣,即聲明一個T* const指針,表示這個迭代器自己的值不能夠改變,不能再指向其它的東西,但其所指向的對象的值是能夠改變的。例如:code
const std::vector<int>::iterator iter = vec.begin() iter++; //error *iter = 10; //ok
而若是但願迭代器所指向的東西不能夠被改動,而迭代器自己能夠變化即但願其效果像const T*指針,那麼須要一個const迭代器,即const_iterator,例如:對象
std::vector<int>::const_iterator cIter = vec.begin(); cIter++; //ok *cIter = 10; //error
3 const成員函數:const成員函數在聲明和定義時都要用const修飾,若是兩個成員函數只是由於const屬性不一樣,這兩個函數能夠重載,例以下面兩個函數能夠同時存在於一個類中:文檔
string GetName() const; //const成員函數 string GetName(); //non-const成員函數
非const對象既能夠調用const成員函數,也能夠調用非const成員函數,若是存在上面這種重載的const成員函數和非const成員函數,非const對象會調用非const成員函數;const對象只能夠調用const成員函數,由於調用非const成員函數,可能會對其值作修改。string