??const關鍵字指定變量的值是恒定的,以防止程序員修改它,并且在定義一個const變量時必須初始化它,除非你用了extern關鍵詞準備來進行外部鏈接。
const int i = 5; //right,和 int const i=5; 等價 const int j; //error,未初始化extern const int k; //right,外部鏈接??注意,const在這里可以不為其初始化。
??我們很容易知道第三句代碼是錯的。也就是不可以把指向常量的指針賦給一個普通的指針,這是為了防止普通指針修改該常量。 ??那下面的代碼呢?
int x = 1;int* const con_p = &x;int* p = con_p; //right??這句代碼是對的。把指向變量的常量指針賦給一個普通指針,注意賦值的是x的地址,這無關常量指針的事,要注意區分。
??請注意,const是一個左結合的類型修飾符,根據這個特點可以很容易總結如下: ??const int* p
,指向常量int的指針,即int是常量,指針是變量; ??int* const p
,指向變量int的常量指針,即int是變量,指針是常量。
??表示類成員常量,不能被修改,同時它只能在初始化列表中賦值。
class Base { PRivate: const int data; //類成員常量public: Base(int x):data(x){} //列表初始化}??const修飾類的成員函數,則該成員函數不能修改類成員變量和調用類中任何非const成員函數。一般寫在函數的最后來修飾。
class Base { private: int data; public: Base(int x):data(x){} void func1() { ; } void func2()const { data = 1; //error } void func3()const { func1(); //error } }??const修飾的變量不可改變,這是規定,但是在C++指針面前,一切皆有可能??聪旅娴拇a:
#include<iostream>using namespace std;int main(){ const int x = 1; int* p = (int*)&x; *p = 9; cout << x << endl; //1 cout << *P << endl; //9}??代碼很簡單,我們利用指針p對常量x進行修改,輸出結果*p表明我們確實改變了x。但是存在疑問的是為什么輸出x還是1呢?這是因為,編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有存儲與讀內存的操作,使得它的效率很高。 文章轉自我的個人博客:http://www.61mon.com/index.php/archives/167/
新聞熱點
疑難解答
圖片精選