型別前加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的值在被賦初值後不可以修改。但是這和由巨集定義...