1. 程式人生 > >c++ primer 中講的頂層const 和 底層 const 理解

c++ primer 中講的頂層const 和 底層 const 理解

prime con 需要 clas 拷貝 就是 如何 col 常量

c++ primer 中講的 頂層const 和 底層 const 以前沒搞懂的頂層const和底層const,這次看了後感覺明白了。

首先,const是一個限定符,被它修飾的變量的值不能改變

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

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

指針如果添加const修飾符時有兩種情況: 1 指向常量的指針:代表不能改變其指向內容的指針。聲明時const可以放在類型名前後都可,拿int類型來說,聲明時:const int和int const 是等價的。聲明指向常量的指針也就是底層const,下面舉一個例子:
  1. int num_a = 1;
  2. int const *p_a = &num_a; //底層const
  3. //*p_a = 2; //錯誤,指向“常量”的指針不能改變所指的對象

註意:指向“常量”的指針不代表它所指向的內容一定是常量,只是代表不能通過解引用符(操作符*)來改變它所指向的內容。上例中指針p_a指向的內容就不是常量,可以通過賦值語句:num_a=2; 來改變它所指向的內容。

2 指針常量:代表指針本身是常量,聲明時必須初始化,之後它存儲的地址值就不能再改變。聲明時const必須放在指針符號*後面,即:*const 。聲明常量指針就是頂層const,下面舉一個例子:

  1. int num_b = 2;
  2. int *const p_b = &num_b; //頂層const
  3. //p_b = &num_a; //錯誤,常量指針不能改變存儲的地址值
其實頂層const和底層const很簡單。 1.一個指針本身添加const限定符就是頂層const。指針被限定則                  2.而指針所指的對象添加const限定符就是底層const。對象被限則 底)

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

區分後有兩個作用。 1 執行對象拷貝時有限制,常量的底層const不能賦值給非常量的底層const。也就是說,你只要能正確區分頂層const和底層const,你就能避免這樣的賦值錯誤。下面舉一個例子:
  1. int num_c = 3;
  2. const int *p_c = &num_c; //p_c為底層const的指針 還有一點記住 就是不能通過p_c去修改變量的值
  3. //int *p_d = p_c; //錯誤,不能將底層const指針賦值給非底層const指針
  4. const int *p_d = p_c; //正確,可以將底層const指針復制給底層const指針
2 使用命名的強制類型轉換函數const_cast時,需要能夠分辨底層const和頂層const,因為const_cast只能改變運算對象的底層const。下面舉一個例子:
  1. int num_e = 4;
  2. const int *p_e = &num_e;
  3. //*p_e = 5; //錯誤,不能改變底層const指針指向的內容
  4. int *p_f = const_cast<int *>(p_e); //正確,const_cast可以改變運算對象的底層const。但是使用時一定要知道num_e不是const的類型。
  5. *p_f = 5; //正確,非頂層const指針可以改變指向的內容
  6. cout << num_e; //輸出5

c++ primer 中講的頂層const 和 底層 const 理解