C++之const限定符
作者:tongqingliu
轉載請註明出處:http://blog.csdn.net/qq_22186119/article/details/73477575
C++之const限定符
const初始化
const的特點:
- 用const加以限定的變數,無法改變。
- 由於const物件定義之後就無法改變,所以必須對其進行初始化。
- const物件的常量特徵僅在嘗試改變它的時候表現出來,其他時候和變數無異。
const初始化:
const int bufSize = 512; //bufSize無法再改變
const僅在本檔案中有效
const物件通常只在本檔案內有效,如果希望其在其他檔案中也有效,則需要在其前面加上extern
關鍵字。更詳細的做法是,在一個檔案中定義const,在其他多個檔案中宣告並使用它。
extern const int bufSize = 512;
頂層const和底層const
首先,const是一個限定符,被它修飾的變數的值不能改變。對於一般的變數來說,其實沒有頂層const和底層const的區別,而只有對於指標這類複合型別的基本變數,才有這樣的區別。
如何區分頂層const和底層const?
頂層const表示指標本身是個常量;
底層const表示指標所指向的物件是個常量。
指標如果新增const修飾符時有兩種情況:
- 指向常量的指標:代表不能改變其指向內容的指標。宣告時const可以放在型別名前後都可,拿int型別來說,宣告時:const int和int const 是等價的。宣告指向常量的指標也就是底層const,下面舉一個例子:
int num_a = 1;
int const *p_a = &num_a; //等價於const int *p_a = &num_a,指向const int 型別的指標,是底層const
//*p_a = 2; //錯誤,指向“常量”的指標不能改變所指的物件
注意:指向“常量”的指標不代表它所指向的內容一定是常量,只是代表不能通過解引用符(操作符*)來改變它所指向的內容。
上例中指標p_a指向的內容就不是常量,可以通過賦值語句:num_a=2; 來改變它所指向的內容。
- 常量指標:代表指標本身是常量,宣告時必須初始化,之後它儲存的地址值就不能再改變。宣告時const必須放在指標符號*後面,即:*const 。宣告常量指標就是頂層const,下面舉一個例子:
int num_b = 2;
int *const p_b = &num_b; //指向int型別的const指標,是頂層const
//p_b = &num_a; //錯誤,常量指標不能改變儲存的地址值
其實頂層const和底層const很簡單,一個指標本身新增const限定符就是頂層const,而指標所指的物件新增const限定符就是底層const。
區分頂層const和底層const的作用
為啥非要區分頂層const和底層const呢,根據C++primer的解釋,區分後有兩個作用。
1 執行物件拷貝時有限制,常量的底層const不能賦值給非常量的底層const。也就是說,你只要能正確區分頂層const和底層const,你就能避免這樣的賦值錯誤。下面舉一個例子:
int num_c = 3;
const int *p_c = &num_c; //指向const int的指標,是底層指標
//int *p_d = p_c; //錯誤,不能將底層const指標賦值給非頂層const指標
const int *p_d = p_c; //正確,都是指向const int的指標
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
3練習
說了這麼多,應該練習一下,const int const*const pppi 是頂層const還是底層const?
答案當然是底層const,因為int前面const限定符,而最後一個*後面沒有const限定符。看最後一個例子:
const int a = 1; //a是頂層const
//int * pi = &a; //錯誤,&a是底層const,不能賦值給非底層const
const int * pi = &a; //正確,&a是底層const,可以賦值給底層const
const int *const *const ppi = &pi //即是底層const,也是頂層const
const int *const *const *pppi = &ppi; //底層const
指標和const限定符(另一版本理解方法)
- 指向const物件的指標
- const指標
- 指向const物件的const指標
const double *p;// 指向const double型別的指標
double *const p = π //指向double物件的const指標
const double *const p = π//指向const物件的const指標
下面看幾個例子:
指向const物件的指標
#include<iostream>
using namespace std;
int main()
{
double a = 1.2;
double *p = &a; //p是指向變數a的指標
const double pi = 3.14;
//p = π//錯,要想指向一個const物件,必須用指向const物件的指標
const double *cptr = π //const double型別的指標
//*cptr = 1.5; //錯,指向const物件的指標只能指向const物件,因而不能修改其值
system("pause");
}
const指標
指向const物件的const指標
#include<iostream>
using namespace std;
int main()
{
double a = 1.2;
double *p = &a; //p是指向變數a的指標
const double pi = 3.14;
//p = π//錯,要想指向一個const物件,必須用指向const物件的指標
const double *cptr = π
cptr = &a; //指向const物件的指標也能指向非const物件
//*cptr = 1.5; //但是不能通過指標對其進行修改
int errNum = 0;
int *const curErr = &errNum; //指向int物件的const指標,必須進行初始化,而且該const指標不能再指向其他物件
const double *const pi_ptr = π //指向const double物件的const指標
//不可以再指向其他的物件,而且也不可以通過指標修改物件的值
system("pause");
}
const寫在左邊也行,寫在右邊也行。
const string str1;
string const str2;
上面的兩種寫法都是對的。
參考:
C++ primer 第五版
http://blog.csdn.net/qq_19528953/article/details/50922303
相關文章
- c++筆記_const限定符C++筆記
- const限定符
- C++ 頂層const底層constC++
- C++基礎 constC++
- C++ const 總結C++
- C++ constexp vs constC++
- C++中const的用法C++
- C++ const常量的理解C++
- C++中const小結C++
- C++中const的妙用C++
- C/C++中的constC++
- C++ 中的 const 物件與 const 成員函式C++物件函式
- C/C++ Const 小知識C++
- c/c++ const關鍵字C++
- c++ const 成員函式C++函式
- c++方法後面加constC++
- C++中const的簡單用法C++
- C++函式名後面有個constC++函式
- C++中的 const 關鍵字C++
- 基礎之const解析
- ES6 之 let / const
- ES6之let、const
- C++中const與指標、引用的總結C++指標
- C++中函式後面加const修飾C++函式
- C++中string、char *、char[]、const char*的轉換C++
- const * and * const
- ES6之const和let
- ES6之var、let、const
- C++ const void * 型別轉換簡單測試C++型別
- ES6系列之 let 和 const
- Android 資源限定符命名規則Android
- const char*, char const*, char*const 有何區別?
- es6學習之let和const
- Const
- 頂層const和底層const
- 搞懂頂層const和底層const
- 【C++】C++之Lambda表示式C++
- ES6標準入門之---let與const
- C++之templateC++