一,C++中const的基本知識
1.C++中const的基本概念
1.const是定義常量的關鍵字,表示只讀,不可以修改。
2.const在定義常量的時候必須要初始化,否則報錯,因為常量無法修改,只能在定義的時候才可以進行初始化。
2.C++中const的基本用法
# include<iostream>
int main()
{
// 表示一個整數常量
const int a = 10;
// 表示一個整數常量
int const b = 20;
// 必須在定義定義常量的時候立即進行初始化
// int const c; 該語句報錯,因為未進行初始化
// 表示該指針指向的是一個常量,該指針是一個變量。不可以通過指針間接修改常量的值
const int * c;
c = &a;
// *c = 100; 該語句錯誤,在C++中不允許通過指針間接修改常量的值(在C中是可以的)
// 表示一個常指針,該指針是一個常量,必須要立即初始化,該指針的值一旦初始化就不允許再修改
int d = 100;
int f = 200;
int * const e = &d;
// e = &f; 該語句錯誤,因為常指針不允許修改
// 表示一個指向常量的常指針,該常指針的值不允許修改,該常指針指向的內存空間的值也不允許修改
const int * const g = &d;
// g = &f; 該語句錯誤,常指針不允許被修改
// *g = 20; 該語句錯誤,因為該指針指向的是一個常量,無法間接修改該值
return 0;
}
3.const的易混點的區分以及作函數參數的好處
1.const的易混點
1.常指針:該指針變量是常量,因此叫做常指針,例如:int * const tmp = &a;
2.指向常量的指針:該指針是變量,但是指向的內存空間是常量的內存空間,不允許通過間接賦值的方式改變該內存空間的值。例如:const int * tmp = &b;
3.指向常量的常指針:該指針是常量,該指針指向的內存空間也是常量,即不允許修改指針的值,也不允許間接修改指針指向內存空間的值,例如:const int * const tmp = &b;
2.const作函數參數的好處
1.清楚的區分參數是輸入還是輸出。
2.保護原始數據不被函數內部修改,例如:void setName(const char * name);
二,C++的const的原理
1.C語言中的冒牌貨-const
1.C語言中的const是可以通過指針間接賦值的方式改變常量的值,因此C語言中的const是允許被修改,不是真正意義上的常量。因此是冒牌貨。
2.C++編譯器對const的處理
1.C++的編譯器碰見常量聲明的時候,會在符號表中把該常量放進去。
2.編譯過程中若發現使用常量,則直接以符號表中的值進行替換。
3.編譯過程中若發現對常量進行了&地址操作,則為該常量分配內存空間(兼容C)。
4.C++編譯器雖然可能為常量分配內存空間,但不會使用其存儲空間中的值。
三,const和#define的區別
1.兩者的區別
1.C++中的const類似於宏定義。
2.C++中的const是由編譯器進行處理的,提供類型檢查和作用域檢查。宏定義是由預處理器處理,單純的文本替換而已。