在 C++ 中使用指標的 const 限定符
本文將演示關於如何在 C++ 中使用 const
限定符與指標的多種方法。
在 C++ 中使用 const type var
符號來宣告只讀物件
C++ 提供了關鍵字 const
,作為需要定義為只讀(不可變)的物件的限定詞。const
變數用 const type var
或 type const var
的記號來宣告,這兩種記號在語法上都是正確的,但前一種記號是作為常規樣式使用的。由於 const
限定的物件是不可突變的,所以在宣告過程中必須對其進行初始化。這使得語句 const int number;
-無效,並丟擲編譯器錯誤(可能你的 IDE 也會為此尖叫)。
當 const
變數被初始化後,它不能在執行時被分配不同的值。因此,下面例子中 main
函式的第三行是無效的,編譯器不會處理它。需要注意的是,如果你宣告瞭一個指向同一型別變數的指標,然後試圖將 const
變數的地址分配給它,編譯器就會報錯。請注意,如果我們在編譯時使用 -fpermissive
標誌,後一種錯誤通常會被覆蓋。
#include <iostream>
int main() {
const int number = 1234;
number = 235; //Error
int *ptr = &number; // Error
return 0;
}
在 C++ 中使用 const
限定符與指標來處理只讀物件
const
修飾語經常用於指標。有三種型別的宣告 const type * var
、type *const var
和 const type *const var
。第一種宣告 var
指標指向只讀的 type
物件,也就是說物件不能被修改,但指標本身可以被修改。第二種-var
只讀指向 type
物件的指標,在這裡我們宣告唯一的,可以修改物件的不可變的指標,最後一種定義了指標和物件都是不可變的。
這些符號提供了多種有用的功能,在下面的程式碼示例中,我們將對其進行探討。如上一個例子所示,我們不能將 const
變數的地址儲存在非 const 指標中,但如果我們加上 const
指定符,操作是有效的。但請注意,我們仍然不能通過新宣告的指標來修改儲存的值,這在 main
迴圈的第 4 行中有所體現。
#include <iostream>
using std::cout; using std::endl;
#define STR(num) #num
int main() {
const int number = 1234;
const int *c_ptr = &number;
// *c_ptr = 42; // Error
cout << STR(number) << " - " << number << endl;
cout << STR(*c_ptr) << " - " << *c_ptr << endl;
return 0;
}
輸出:
number - 1234
*c_ptr - 1234
在使用 const
限定符時,另一個常見的問題是非 const 指標對指向只讀物件的指標的分配。請注意,在下一個程式碼示例中,有一個新的非 const 變數 number2
被初始化,而宣告為 const
物件指標的 c_ptr
,現在被分配給 number2
的地址。這個操作在 C++ 中是合法的,其結果是我們只能通過 c_ptr
讀取儲存在 number2
變數中的值,但任何修改都會導致編譯器錯誤。
#include <iostream>
using std::cout; using std::endl;
#define STR(num) #num
int main() {
const int number = 1234;
const int *c_ptr = &number;
int number2 = 3456;
c_ptr = &number2;
// *c_ptr += 12; // Error
number2 += 12;
cout << STR(number) << " - " << number2 << endl;
cout << STR(*c_ptr) << " - " << *c_ptr << endl;
return 0;
}
輸出:
number2 - 3468
*c_ptr - 3468
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn