const修飾符限定的常量

2022-06-12 06:30:08 字數 2568 閱讀 9559

型別前加const修飾符限定變數為唯讀,稱為常量,定義時必須初始化,且初始化後編譯器不允許再修改常量的值。

const在型別前面

const int value;                  //value是const

const char *value; //*value是const, value可變

const (char *) value; //value是const,*value可變

char* const value; //value是const,*value可變

const char* const value; //value和*value都是const

const在型別後面

int const value;                // value是const

char const * value; // *value是const, value可變

(char *) const value; //value是const,*value可變

char* const value; // value是const,*value可變

char const* const value; // value和*value都是const

總結

const在\(*\)左側指標所指的值不可改變,const在\(*\)右側指標不可改變。

non-const轉化為const

int a = 10;

const int b = const_case(a);

const_case\([type]\)>(\([data]\))會返回non-const。

一般不用,因為直接\(int b = a\)就好,因為\(a\)作為常量可以直接賦給變數

const轉化為non-const

const int a = 10;

int b = const_cast(a);

const_cast<\([type]\)>(\([data]\))可用於去除const。

一般的常量賦值給變數沒有問題,但指標所指的值為const時要利用變換const_cast去const限定。

可以理解為指標所指的值限定為const時,編譯器限定該位址下所存的為常量唯讀,而賦給普通指標時,普通指標預設改位址下存的為變數可以被更改。然而同一位址下不可能即為常量又為變數,所以報錯。

const int a = 10;

int b = a; //正確

const int* c = &a;

int *d = c; //報錯

int *e = const_cast(c); //正確

const int c = 10;

int *e = const_cast(&c);

(*e)++;

cout << "c address= " << &c << endl;

cout << "e adderss= " << e << endl;

cout << "c value= " << c << endl;;

cout << "e value= " << *e << endl;

//輸出為

// c address= 0x7ffde623acb4

// e adderss= 0x7ffde623acb4

// c value= 10

// e value= 11

雖然位址相同但卻存著不同的值,猜想可能的原因在於編譯器進行了優化,由於暫存器訪問的速度遠遠超過記憶體訪問速度,因此編譯器會將部分資料儲存在暫存器中,需要時直接從暫存器中取出。本題資料型別為const,編譯器認為資料不會被修改,因此放心大膽從暫存器中取值了,但是事實上記憶體中的資料已經被修改了。

如何來驗證上面的猜測呢,當然是禁止編譯器優化了,可以使用volatile關鍵字禁止編譯器的優化,這樣編譯器每次都不得不從記憶體中取資料,這樣在記憶體中資料被修改後就會相應修改了。

volatile const int c = 10;

int *e = const_cast(&c);

(*e)++;

cout << "c address= " << &c << endl;

cout << "e adderss= " << e << endl;

cout << "c value= " << c << endl;;

cout << "e value= " << *e << endl;

//輸出為

// c address= 1

// e adderss= 0x7ffd2e357204

// c value= 11

// e value= 11

可以看到值變為相同的了,但位址變為1了,小生也不知道為什麼(:

關於常量修飾符 const

關於常量修飾符 const 一直對const的理解就是簡單的常量修飾符,定義乙個不可改變的變數 注意這裡是變數,也就是說const叫常量修飾符,但實際上它定義的是乙個變數,只不過由編譯器限定未不可修改 後來聽了老師的課發現const有許多有意思的用法 1 const int i 10 i的值不可改變...

c 中的const限定修飾符

const 限定修飾符 1.const int buffersize 512 常量,不允許用非 const 物件指標指向 如int psize buffersize error const int psize buffersize right.2.const double pc dval 指向dou...

const 型別修飾符

const是用來限定所指定的變數或者函式不可作修改。1 修飾變數 當const用來修飾變數的時候,const所指定部分不可修改。a.修飾常規變數 如 const int a 10 int const a 10 這兩種方式的效果一樣,都是將a描述為常量,a的值在被賦初值後不可以修改。但是這和由巨集定義...