C以及C++在const的區別,以及const在C++的增強
阿新 • • 發佈:2019-02-14
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