const 位於返回類型前,表明返回對象爲常量,不可改變。
如果修飾指向常量的指針。
1 const char * const helpFun()
2 {
3 char * p =new char[3];
4 p[0]='a';
5 p[1]='b';
6 p[2]='\0';
7 return p;
8 }
9
10 int main()
11 {
12 const char * p = helpFun();
13 p++;
14 cout<<p<<endl;
15 delete p;
16 return 0;
17 }
如果通過函數來創建常字符串,除了在main 函數中約束之外,也可以在函數返回類型中約束,第一行中左邊的const 約束了返回的是常字符串的指針索引,因爲它的存在12行必須聲明爲 const char *p,如果第一行左邊const 不存在,那麼12行可以加可以不加const,這樣約束常字符串的效果只能在main 中反映,不能很好的表達調用函數的功能。
同時第一行中的第二個const 加了也無效,其約束的是一個由 char * p 轉變爲 char * const 的隱藏指針,該隱藏指針的指向值賦予給main 函數中的p,所以後者可以修改指向。
const位於方法參數列表後,如 void test() const;
此種情況表明,此方法不會改變調用對象的狀態,保證了調用對象的常量性。
const修飾成員函數的兩個作用
在設計類的時候,一個原則就是對於不改變數據成員的成員函數都要在後面加 const,而對於改變數據成員的成員函數不能加 const。所以 const 關鍵字對成員函數的行爲作了更加明確的限定:有 const 修飾的成員函數(指 const 放在函數參數表的後面,而不是在函數前面或者參數表內),只能讀取數據成員,不能改變數據成員;沒有 const 修飾的成員函數,對數據成員則是可讀可寫的。
除此之外,在類的成員函數後面加 const 還有什麼好處呢?
“獲得能力:可以操作常量對象”,其實應該是常量(即 const)對象可以調用 const 成員函數,而不能調用非const修飾的函數。
對於const成員函數,"不能修改類的數據成員,不能在函數中調用其他不是const的函數",這是由const的屬性決定的 。