頂層const和底層const

const與指針

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和底層const?

我總結的技巧,分享一下。指針

  • 若是const後面緊跟着的是一個簡單類型,則跳過這個簡單類型,修飾後面的數據。(簡單類型是指非複合類型,如int,class以及typedef,using包裝後的類型等)
  • 若是const後面就是一個數據,則直接修飾這個數據。

當在一個定義中同時出現頂層const和底層cosnt時,咱們能夠不看其中一個const從而方便給另外一個const定性,一樣也是使用上述技巧。code

相關文章
相關標籤/搜索