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

Jinku Hu 2023年1月30日 2021年1月4日
  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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

相關文章 - C++ Const

相關文章 - C++ Pointer