1. 程式人生 > >C以及C++在const的區別,以及const在C++的增強

C以及C++在const的區別,以及const在C++的增強

C語言中const是一個偽常量,可以通過指標間接賦值改變,在C++中const得到加強,定義的是真常量。

const int a = 3;const int b = 4;int array[a + b] = { 0 };以上語句在C語言報錯,在C++中通過,即可說明真偽常量的區別。

定義:const type name=value;注意:初始化和定義一起

C語言通過指標改變const值:

void test5()
{
	const int a ;
	//int const b; //const int , int const 是等價的

	int *p = (int*)&a;
	*p = 20;//C語言中可以通過指標的間接賦值改變const變數 

	printf("a = %d\n", a);
}

在C++中指標無法這樣的原因是,C++沒有像C語言一樣給const常量分配記憶體單元,const常量被放在一個只讀的符號表

例如定義一些const常量:const int a=10;   int const b=20;

符號表
name value
a 10
b 20

C++中使用如上指標變數間接賦值時,指標p指向的是編譯器在棧中找的一個臨時儲存單元(即將臨時空間的地址賦給p),因此在C++中,執行上述程式碼後,a的值沒有改變。

不管是在C還是C++中int const b; const int b 是等價的,然而const int *a和int *const a卻是有區別的。

const int *a  —— 一個指向常整形數的指標(所指向的記憶體資料不能被修改,但是本⾝(即地址)可以修改)

int *const a —— 常指標(指標變數不能被修改,但是它所指向記憶體空間可以被修改)

const int* const a —— 一個指向常整形的常指標(指標和它所指向的記憶體空間,均不能被修改)

用幾個程式碼區分他們:

struct student
{
	int id;
	char name[64];
};

void change_stu(struct student *s)
{
	s ->id = 10;//常規指標變數
}

void change_stu2(const struct student *s)
{
	s->id=10; //此時s所指向的區域是一個常量 不能夠被修改,報錯
	struct student s2;//可以建立一個新的變數取其地址賦給s,編譯通過,說明s本身是可以改變的
	s = &s2;
	cout << s << endl;
}

void change_stu3(struct student *const s)
{
	s->id = 10;//編譯通過,s是一個常量指標,本身不可變,但指向的區域是可變的
	struct student s2;//再次報錯,因為s是一個常量指標
	s = &s2;  
}

void change_stu4(const struct student *const s)
{
	s->id = 10;
	struct student s2;
	s = &s2;  //以上都是錯的,s是一個指向常量的常量指標。
}

再來談談,const和#define的區別吧

1.編譯階段不一樣:const是編譯器處理,define是前處理器

2.const劃分作用域,define是全域性的

建議使用const