const和指針會造成2種不一樣性質的組合形式:const修飾指針自己 與 const修飾指針指向的那個內存數據。在《C++ Primer》一書中做者使用頂層const和底層const這2個術語來描述這2種狀況。前者就是所謂的頂層const,然後者就是底層const。下面用代碼列舉了這些狀況:spa
int main(int argc, char *argv[]) { int a = 1; const int*p1 = &a; //p1是底層const,經過p1不能改變p1指向的數據a。p1自己可變。 int const*p2 = &a; //同上,p2是底層const,經過p2不能改變p2指向的數據a。p2自己可變。 //-------------------- int* const p3 = &a; //p3是頂層const,p3自己不能改變,始終指向a,可是經過p3能夠改變a的值 //-------------------- const int* const p4 = &a; //頂層const和底層const的結合。p4自己是const,且經過p4沒法改變它指向的數據a int const* const p5 = &a; //同上 //-------------------- typedef int* pint_t; //使用typedef將int*包裝爲一個簡單類型 pint_t const pint_t p6 = &a; //const修飾p6,是頂層const pint_t const p7 = &a; //同上 //------C++11中的using類型別名-------------- using pchar_t = char*; //typedef包裝類型別名的另外一種替代方法 char c = 'A'; const pchar_t p8 = &c; //const修飾p8,是頂層const pchar_t const p9 = &c; //同上 return 0; }
我總結的技巧,分享一下。指針
當在一個定義中同時出現頂層const和底層cosnt時,咱們能夠不看其中一個const從而方便給另外一個const定性,一樣也是使用上述技巧。code