首先我們先看一個例子:
#include#include using namespace std; struct S{ const int c; //常量普通成員變量 static const int sc; //常量靜態成員變量 S():c(0){ } }; const int S::sc = 0; const int gc = 0; //常量全局變量 static const int gsc = 0; //常量靜態全局變量 int main() { const int lc = 0; //常量局部變量 static const int lsc = 0; //常量靜態局部變量 const S ls; //局部常量結構體 int *p; p = (int *)(&ls.c); //p = (int *)(&ls.sc); //p = (int *)(&gc); //p = (int *)(&gsc); //p = (int *)(&lc); //p = (int *)(&lsc); *p += 10; cout << *p << "\t" << ls.c << endl; // 10 10 - (1) //cout << *p << "\t" << ls.sc << endl; // 段錯誤 - (2) //cout << *p << "\t" << gc << endl; // 段錯誤 - (3) //cout << *p << "\t" << gsc << endl; // 段錯誤 - (4) //cout << *p << "\t" << lc << endl; // 10 0 - (5) //cout << *p << "\t" << lsc << endl; // 段錯誤 - (6) return 0; }
通過上例,我們可以總結出如下結論:
1. 全局const變量和static const變量由於被存放在只讀的常量區,所在內存被訪問時會出現段錯誤;
2. 局部const變量存放在可讀寫的棧中,可以通過指針修改其值;
3. 簡單常量在編譯時被作為常量展開,所以(5)中的cout << lc << endl事實上運行的是 cout << 0 << endl;而結構體的成員常量並未做此展開。