1. 程式人生 > >C++小知識——const詳解

C++小知識——const詳解

一、const的基本使用情況

使用情況 格式
常變數 const 型別說明符 變數名 (可互換const和型別說明符)
常引用 const 型別說明符 &引用名(可互換const和型別說明符)
常物件 類名 const 物件名(可互換const和型別說明符)
常成員函式 類名::函式名(形參表) const
常陣列 型別說明符 const 陣列名[大小]
(可互換const和型別說明符)
常指標 型別說明符 const *變數名

二、const修飾指標的情況

首先定義了一個整型變數b並給它賦值100

情況1:const位於*號的左側,與const放在變數宣告符中的位置無關

const int *a = &b;等價於int const *a = &b;
這種情況下,const就是用來修飾指標所指向的變數,即指標指向為常量
這樣,可以先不進行初始化,因為雖然指標的內容是常量,但指標本身不是常量。const int *a;是正確的。

舉個例子:假如a是一個倉庫管理員,他所管理的倉庫裡面的貨物他是沒有許可權去動的。
在這裡插入圖片描述


但是,也有兩種辦法去改變倉庫裡面的值:
最直接的當然是直接改變變數b的值了
在這裡插入圖片描述
間接的方法就是讓a指向另外一個變數
在這裡插入圖片描述

情況2:const位於*號的右側,const修飾指標本身,即指標本身是常量

int* const a;這種情況下不能對指標本身進行更改操作,而指標所指的內容不是常量
由於指標本身是常量,所以一定要在定義的同時進行初始化
在這裡插入圖片描述
在這裡插入圖片描述

情況3:星號的左右兩側都有,指標本身和指標指向的內容都是常量

const int* const a = &b;


三、與#define的區別

雖然它們都可以定義常量,但是const比#define有更多的優點:

  • const常量有資料型別,而巨集常量沒有資料型別。
    因此編譯器可以對前者進行安全檢查,而只對後者進行字元替換,而且在替換過程中可能有邊際效應
  • 有些除錯工具可以針對const進行除錯,而不能對巨集常量進行除錯

四、如何修改常成員函式中類的成員變數

在類的成員變數中,用mutable修飾成員變數名後,就可以在const成員函式中修改成員變數的值了