昨天在寫程式時,突然想到了一個問題:const變數真的不可改變嗎?如果能改,應該怎麼改?於是乎,就決定動手操作一番,結果程式的結果有點出乎意料。但是最終還是得出了結論。如有不妥,歡迎各位拍磚!
下面就來看一下這個簡單的程式:
#include <iostream>using namespace std;int main(void){const int sum = 0;cout << "sum的初始值是:" << sum << endl;int *result = const_cast<int *>(&sum);*result = 20;cout << "sum的值現在是:" << sum << endl;cout << "result的值現在是:" << *result << endl;cout << "sum的地址是:" << &sum << endl;cout << "result的地址是:" << result << endl;getchar();return 0;}
程式的運行結果:
sum的初始值是:0sum的值現在是:0result的值現在是:20sum的地址是:0012FF60result的地址是:0012FF60
怎麼是這樣的結果:這下讓我有點迷茫,但是也感覺更有意思了。剛開始我覺得,只要使用指標指向這個const常量,就可以修改,結果發現這樣並不能修改const常量。通過程式的結果我們不難發現,result指向的地址確實是sum的地址,同樣的地址為什麼列印出來的值卻不一樣呢?原因是這樣的:對於這種const常量,其值在編譯期間是不知道的。這就意味著需要儲存空間,而編譯器不想保留它的符號表中的任何東西,而且一旦初始化,其值就不能改變。雖說result指向了sum的地址,可實際上指向的卻是sum常量的一個拷貝的地址。當再次使用sum時,就會發現sum的值並沒有被改變!
還有另一種情況:
#include <iostream>using namespace std;const int sum = 0;int main(void){cout << "sum的初始值是:" << sum << endl;cout << "sum的地址是:" << &sum << endl;int *result = const_cast<int *>(&sum);*result = 20;cout << "sum的值現在是:" << sum << endl;cout << "result的值現在是:" << *result << endl;cout << "sum的地址是:" << &sum << endl;cout << "result的地址是:" << result << endl;getchar();return 0;}
這種情況是編譯期間的const,通過實驗,這種方式修改const,程式根本不能運行,直接報錯。原因是這樣的:在這個程式中,sum是一個全域變數,C++編譯器不會為其分配空間,而是直接將其儲存在符號表中,待要取得const常量地址時,再迫使編譯器為其分配空間,所以,當result指向sum,並試圖修改其內容時就會出現:在此位置寫入時發生存取違規錯誤!
總結:所以通過這種方式,是不能修改const常量的!