const指針和指向const變量的指針,在寫法上容易讓人混淆,記住一個規則:從左至右,依次結合,const就近結合。
比如,int * const p:
1.int * (const p):變量p經過Const修飾,為只讀變量
2.int (*(const p)):(const p)作為一個整體成為一個只讀指針指向int型變量
3.(int(*(const p))):(*const p)作為一個整體,只讀指針p指向Int型變量
於是,int * const p:一個指向整型變量的Const型指針
再比如, const int *p:
1.const int (*p):變量p是一個指針
2. (const int) (*p): (const就近結合)變量p指向一個const類型的整型
於是,const int *p: 一個指向const整型變量的指針
用法:
1.用於定義常量變量,這樣這個變量在后面就不可以再被修改
const int Val = 10;
//Val = 20; //錯誤,不可被修改
2. 保護傳參時參數不被修改,如果使用引用傳遞參數或按地址傳遞參數給一個函數,在這個函數里這個參數的值若被修改,
則函數外部傳進來的變量的值也發生改變,若想保護傳進來的變量不被修改,可以使用const保護
void fun1(const int &val)
{
//val = 10; //出錯
}
void fun2(int &val)
{
val = 10; //沒有出錯
}
void main()
{
int a = 2;
int b = 2;
fun1(a); //因為出錯,這個函數結束時a的值還是2
fun2(b);//因為沒有出錯,函數結束時b的值為10
}
如果只想把值傳給函數,而且這個不能被修改,則可以使用const保護變量,有人會問為什么不按值傳遞,按值傳遞還需要把這個值復制一遍,
而引用不需要,使用引用是為了提高效率//如果按值傳遞的話,沒必要加const,那樣根本沒意義
3. 節約內存空間,
#define PI 3.14 //使用#define宏
const double Pi = 3.14 //使用const,這時候Pi並沒有放入內存中
double a = Pi; //這時候才為Pi分配內存,不過后面再有這樣的定義也不會再分配內存
double b = PI; //編譯時分配內存
double c = Pi; //不會再分配內存,
double d = PI; //編譯時再分配內存
const定義的變量,系統只為它分配一次內存,而使用#define定義的常量宏,能分配好多次,這樣const就很節約空間
4.類中使用const修飾函數防止修改非static類成員變量, 普通的成員變量在const修飾的成員函數中都不能進行修改.仿佛只能用在類函數中不能修飾普通的函數體.
class
{
public:
void fun() const //加const修飾
{
a = 10; //出錯,不可修改非static變量
b = 10; //對,可以修改
}
private:
int a ;
static int b;
}
6.修飾函數返回值,防止返回值被改變
const int fun();
接收返回值的變量也必須加const
const int a = fun(); //接收的變量也要是const的,int a = fun()是錯誤的
7.修飾類的成員變量
使用const修飾的變量必須初始化,在類中又不能在定義時初始化,
如;
class
{
private:
int a = 10;
const int b = 10;
static const int c = 10;
//這樣初始化都是錯的,
}
初始化const int類型(沒有static),在類的構造函數上初始化
Class Test
{
Public:
Test():b(23) //構造函數上初始化b的值為23
{
}
private:
const int b ;
}
初始化staticconst int這個類型的(帶有static的),在類的外面初始化
class Test
{
private:
static const int c;
}
const int Test::c=10; //類的外部初始化c為10
8.const定義的對象變量只能作用於這個程序該C/C++文件,不能被該程序的其他C/C++文件調用,
如file1.cpp中 const int val;
在file2.cpp中, extern intval; //錯誤,無法調用,
要想const定義的對象變量能被其他文件調用,定義時必須使用extern修飾為
extern const int val;
非const變量默認為extern,要是const能被其他文件訪問必須顯示指定為extern