c++用了那么久,覺得 const 和指針配合到一起的時候就會有點點分不出來。
如下:
const Data* pData;Data const * pDataData * const pDataconst Data * const pData Data const * const pData
是不是有點暈?
我其實用得最多的是 const Data* pData, 也理解該語句是定義 pData指向的對象是不允許修改的(不能通過pData指針調用非const方法)。
那么Data * const pData 實際就是指針本身是不可修改的(你不能將該指針賦值成另一個地址)。
實際上只會出現3中情況.
一種修飾語義是將指針所指向的對象修飾為const.
一種修飾予以是將指針本身(值類型)修飾為const, 本質上像你定義一個 const long 一樣。
最后一種是對象為const 同時指針也為const.
那么,上面那一串代碼都可以對號入座。
簡單的辦法是:
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 為啥放左邊表示修飾對象的時候想起這個故事來著。
不要在意這些細節,我真是一個很會自娛自樂的人。