c++用了那麼久,以爲 const 和指針配合到一塊兒的時候就會有點點分不出來。c++
以下:spa
const Data* pData; Data const * pData Data * const pData const Data * const pData Data const * const pData
是否是有點暈?指針
我其實用得最多的是 const Data* pData, 也理解該語句是定義 pData指向的對象是不容許修改的(不能經過pData指針調用非const方法)。code
那麼Data * const pData 實際就是指針自己是不可修改的(你不能將該指針賦值成另外一個地址)。對象
實際上只會出現3中狀況.blog
一種修飾語義是將指針所指向的對象修飾爲const.class
一種修飾予以是將指針自己(值類型)修飾爲const, 本質上像你定義一個 const long 同樣。方法
最後一種是對象爲const 同時指針也爲const.總結
那麼,上面那一串代碼均可以對號入座。di
簡單的辦法是:
const 關鍵字出如今 * 前面, 修飾的是對象
const 關鍵字出如今 * 後面, 修飾的是指針
好了,再分析以前的例子:
const Data* pData; //修飾對象 Data const * pData //修飾對象 Data * const pData //修飾指針 const Data * const pData //修飾對象 + 指針 Data const * const pData //修飾對象 + 指針
因此有那麼多種寫法,其實就是在*左邊和右邊的問題。
咱們應該始終按本身的風格選擇一種固定模式就好。
爲何const 出如今 * 左邊是修飾對象而不是修飾指針
而爲何const 出如今 * 右邊是修飾指針而不是修飾對象
要理解這個,須要先理解神射手理論
說有一個神射手,隨意的在槍靶上,每隔1cm的地方打了一個眼。
這個槍靶上居住着一種二維生物。
通過不少該生物的宇宙年後,該生物中的科學家終於發明了太空飛船,開始探索本身的宇宙。
最後他們總結出他們的宇宙第必定律,就是每隔1cm的地方有個洞。
哈哈, 我忘記我是在哪看到這個段子的了,是3T仍是BigBang. 可是我在思考const 爲啥放左邊表示修飾對象的時候想起這個故事來着。
不要在乎這些細節,我真是一個很會自娛自樂的人。