cpp:const引出的那些事

Getone超發表於2024-03-14

1.常變數

  const int i = 10;    
  int const i = 10;

兩種表達方式沒區別

2.指標與const

  • 如果const位於*的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量;
  • 如果const位於*的右側,const就是修飾指標本身,即指標本身是常量。
  • 利用英文從右邊往左邊讀,並且以to為分界,to之前為描述指標的特性,to之後為描述目標的特性

指標常量: 指向常量的指標

const int *a;
int const *a;

1.對於指向常量的指標,不能透過指標來修改物件的值。
2.不能使用void*指標儲存const物件的地址,必須使用const void*型別的指標儲存const物件的地址。
3.允許把非const物件的地址賦值給const物件的指標,如果要修改指標所指向的物件值,必須透過其他方式修改,不能直接透過當前指標直接修改。
eg:
    const int p = 10; //定義一個常量
    const void * vp = &p;//將這個常量地址付給這指向常量的指標
	int val = 3;
	ptr = &val; // ok,指標可以改變自己的指向
	*ptr=4;//error,不能透過指標來修改物件的值

常指標:const指標不能修改指向

int* const a;

eg:
    int num=0, num1=1;
    int * const ptr=# // const指標必須初始化!且const指標的指向不能修改
    ptr = &num1; // error! const指標不能修改指向!
	*ptr=1;//ok,const指標指向的值能修改

指向常量的常指標

const int* const a;

3.類函式中的const

const物件只能訪問const成員函式,而非const物件可以訪問任意的成員函式,包括const成員函式.

int Apple::add(int num) const
int Apple::add(int num) 
  • Apple物件可以訪問add()和add() const;
  • const Apple物件只能訪問add() const;

在一個類中,任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改 資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性

類中常量

不能在類宣告中初始化 const 資料成員。以下用法是錯誤的,因為類的物件未被建立時,編譯器不知道 SIZE 的值是什麼。(c++11標準前)

class A 
{
  const int SIZE = 100;   // 錯誤,企圖在類宣告中初始化 const 資料成員 
  int array[SIZE];  // 錯誤,未知的 SIZE 
};
根本原因:const的生命週期在物件A創造之前是不存在的。

正確做法

class A 
{
  A(int size);  // 建構函式 
  const int SIZE ;    
}; 
A::A(int size) : SIZE(size)  // 建構函式的定義
{ 

} 
A  a(100); // 物件 a 的 SIZE 值為 100 
A  b(200); // 物件 b 的 SIZE 值為 200 

cosnt static 常量 可以解決生命週期的問題