C++的頂層const和底層const的理解


對於一般的變量來說,其實沒有頂層const和底層const的區別,而只有向指針這類復合類型的基本變量,才有這樣的區別。

一、如何區分頂層const和底層const

  指針如果添加const修飾符時有兩種情況:

  1 、指向常量的指針:代表不能改變其指向內容的指針。

    聲明時const可以放在類型名前后都可,拿int類型來說,聲明時:const int和int const 是等價的。

    聲明指向常量的指針也就是底層const,下面舉一個例子:

      int num_a = 1;
      int const  *p_a = &num_a; //底層const
      //*p_a = 2;  //錯誤,指向“常量”的指針不能改變所指的對象

  2、指針常量:代表指針本身是常量,聲明時必須初始化,之后它存儲的地址值就不能再改變。

    聲明時const必須放在指針符號*后面,即:*const 。

    聲明常量指針就是頂層const,下面舉一個例子:

      int num_b = 2;
      int *const p_b = &num_b; //頂層const
      //p_b = &num_a;  //錯誤,常量指針不能改變存儲的地址值

二、區分頂層const和底層const的作用

 

  為啥非要區分頂層const和底層const呢,根據C++primer的解釋,區分后有兩個作用:

 

  1、 執行對象拷貝時有限制,常量的底層const不能賦值給非常量的底層const。

    也就是說,你只要能正確區分頂層const和底層const,你就能避免這樣的賦值錯誤。

    下面舉一個例子:

      int num_c = 3;
      const int *p_c = &num_c;  //p_c為底層const的指針
      //int *p_d = p_c;  //錯誤,不能將底層const指針賦值給非底層const指針
      const int *p_d = p_c; //正確,可以將底層const指針復制給底層const指針

  2、 使用命名的強制類型轉換函數const_cast時,需要能夠分辨底層const和頂層const。

    因為const_cast只能改變運算對象的底層const。下面舉一個例子:

      int num_e = 4;
      const int *p_e = &num_e;
      //*p_e = 5;  //錯誤,不能改變底層const指針指向的內容
      int *p_f = const_cast<int *>(p_e);  //正確,const_cast可以改變運算對象的底層const。但是使用時一定要知道num_e不是const的類型。
      *p_f = 5;  //正確,非頂層const指針可以改變指向的內容
      cout << num_e;  //輸出5

 

 
 
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM