在 C++ 中使用指標的 const 限定符

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用 const type var 符號來宣告只讀物件
  2. 在 C++ 中使用 const 限定符與指標來處理只讀物件
在 C++ 中使用指標的 const 限定符

本文將演示關於如何在 C++ 中使用 const 限定符與指標的多種方法。

在 C++ 中使用 const type var 符號來宣告只讀物件

C++ 提供了關鍵字 const,作為需要定義為只讀(不可變)的物件的限定詞。const 變數用 const type vartype 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 * vartype *const varconst 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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Const

相關文章 - C++ Pointer