一蝠猬、const分類如下:
1. 常變量: const 類型說明符 變量名
2. 常引用: const 類型說明符 &引用名
3. 常對象: 類名 const 對象名
4. 常成員函數(shù): 類名::fun(形參) const
5. 常數(shù)組: 類型說明符 const 數(shù)組名[大小]
6. 常指針: const 類型說明符* 指針名 ,類型說明符* const 指針名
首先提示的是:在常變量(const 類型說明符 變量名)统捶、常引用(const 類型說明符 &引用名)榆芦、常對象(類名 const 對象名)、 常數(shù)組(類型說明符 const 數(shù)組名[大小])瘾境, const” 與 “類型說明符”或“類名”(其實類名是一種自定義的類型說明符) 的位置可以互換歧杏。如:
const int a=5; 與 int const a=5; 等同
類名 const 對象名 與 const 類名 對象名 等同
二、用法如下:
用法1:常量
取代了C中的宏定義迷守,聲明時必須進行初始化(!c++類中則不然)犬绒。const限制了常量的使用方式,并沒有描述常量應該如何分配兑凿。如果編譯器知道了某const的所有使用凯力,它甚至可以不為該const分配空間。最簡單的常見情況就是常量的值在編譯時已知礼华,而且不需要分配存儲咐鹤。―《C++ Program Language》
用const聲明的變量雖然增加了分配空間,但是可以保證類型安全圣絮。
C標準中祈惶,const定義的常量是全局的,C++中視聲明位置而定扮匠。
用法2:指針和常量
使用指針時涉及到兩個對象:該指針本身和被它所指的對象捧请。將一個指針的聲明用const“預先固定”將使那個對象而不是使這個指針成為常量。要將指針本身而不是被指對象聲明為常量棒搜,必須使用聲明運算符*const疹蛉。
所以出現(xiàn)在 * 之前的const是作為基礎(chǔ)類型的一部分:
char *const cp; //到char的const指針
char const *pc1; //到const char的指針
const char pc2; //到const char的指針(后兩個聲明是等同的)
從右向左讀的記憶方式:
cp is a const pointer to char. 故pc不能指向別的字符串,但可以修改其指向的字符串的內(nèi)容
pc2 is a pointer to const char. 故pc2的內(nèi)容不可以改變力麸,但pc2可以指向別的字符串
且注意:允許把非 const 對象的地址賦給指向 const 對象的指針,不允許把一個 const 對象的地址賦給一個普通的可款、非 const 對象的指針。
用法3:const修飾函數(shù)傳入?yún)?shù)
將函數(shù)傳入?yún)?shù)聲明為const克蚂,以指明使用這種參數(shù)僅僅是為了效率的原因闺鲸,而不是想讓調(diào)用函數(shù)能夠修改對象的值。同理埃叭,將指針參數(shù)聲明為const翠拣,函數(shù)將不修改由這個參數(shù)所指的對象。
通常修飾指針參數(shù)和引用參數(shù):
void Fun( const A *in); //修飾指針型傳入?yún)?shù)
void Fun(const A &in); //修飾引用型傳入?yún)?shù)
用法4:修飾函數(shù)返回值
可以阻止用戶修改返回值游盲。返回值也要相應的付給一個常量或常指針误墓。
用法5:const修飾成員函數(shù)(c++特性)
const對象只能訪問const成員函數(shù),而非const對象可以訪問任意的成員函數(shù)益缎,包括const成員函數(shù)谜慌;
const對象的成員是不能修改的,而通過指針維護的對象確實可以修改的莺奔;
const成員函數(shù)不可以修改對象的數(shù)據(jù)欣范,不管對象是否具有const性質(zhì)。編譯時以是否修改成員數(shù)據(jù)為依據(jù)進行檢查令哟。
最容易讓人迷惑的是const到底是修飾指針還是指針指向的內(nèi)存區(qū)域恼琼?其實,只要知道:const只對它左邊的東西起作用屏富,唯一的例外就是const本身就是最左邊的修飾符晴竞,那么它才會對右邊的東西起作用。