- 對(duì)于常量來(lái)說满着,系統(tǒng)沒有劃定專門的區(qū)域來(lái)保護(hù)其中的數(shù)據(jù)不能被更改蟹地。也就是說,使用常量的方式對(duì)數(shù)據(jù)進(jìn)行保護(hù)是通過編譯器作語(yǔ)法限制來(lái)實(shí)現(xiàn)的或悲。我們?nèi)匀豢梢岳@過編譯器的限制去修改被定義為“常量”的內(nèi)存區(qū)域
const int c = 10;
int* p = (int*)&c;
// 地址 &c == p
// 也就是說 p 和 c 對(duì)應(yīng)的是同一塊內(nèi)存區(qū)域
// 但是通過 c 訪問這個(gè)內(nèi)存區(qū)域的時(shí)候孙咪,值一直都是 10(這應(yīng)該是編譯器的工作)
*p = 15;
cout << c << endl; // 10
- 引用本來(lái)就不能修改值堪唐,所以也就沒有 const 之說
int i = 10;
int & const c = i; // error
const int & cc = i;; // ok
當(dāng)存在同名同參數(shù)和返回值的常量函數(shù)和非常量函數(shù)時(shí),具體調(diào)用哪個(gè)函數(shù)是根據(jù)調(diào)用對(duì)象是常量對(duì)像還是非常量對(duì)象來(lái)決定的翎蹈。常量對(duì)象調(diào)用常量成員淮菠;非常量對(duì)象調(diào)用非常量的成員。
因?yàn)槌蓡T函數(shù)中有一個(gè)隱含參數(shù)this
荤堪,所以實(shí)質(zhì)上對(duì)應(yīng)const TYPE*
和TYPE*
兩種參數(shù)類型const數(shù)據(jù)成員只在某個(gè)對(duì)象生存期內(nèi)是常量合陵,而對(duì)于整個(gè)類而言卻是可變的。因?yàn)轭惪梢詣?chuàng)建多個(gè)對(duì)象澄阳,不同的對(duì)象其const數(shù)據(jù)成員的值可以不同拥知。所以不能在類聲明中初始化const數(shù)據(jù)成員,因?yàn)轭惖膶?duì)象未被創(chuàng)建時(shí)碎赢,編譯器不知道const 數(shù)據(jù)成員的值是什么低剔。
const數(shù)據(jù)成員的初始化只能在類的構(gòu)造函數(shù)的初始化表
中進(jìn)行。要想建立在整個(gè)類中都恒定的常量肮塞,應(yīng)該用類中的枚舉常量來(lái)實(shí)現(xiàn)襟齿。枚舉常量不會(huì)占用對(duì)象的存儲(chǔ)空間,他們?cè)诰幾g時(shí)被全部求值枕赵。
參考鏈接 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html