const
在C++中有很多效果。
第一個也是最明顯的是,它表示一個值是隻讀的。擴展你的例子一點:
int size = 10000;
const int size2 = 10000;
int main() {
size = 1; // fine
size2 = 2; // won't compile
}
在這種情況下,這意味着size2
真的是一個常數。 C++標準有一些特殊的語言,允許編譯器消除const
限定的變量,只要您只以不需要地址的方式使用它,就將其視爲值。
另一個影響是const限定值有可能被用作常量表達式,所以它可以以非常量表達式不能使用的幾種方式使用,例如定義數組的大小(但是請注意,你很少想在C++中使用數組 - 通常首選的是std::vector
)。
另一個效果(在C++中,但不是C)是定義一個變量作爲const
還使得static
,所以你的情況(其中變量出現任何功能之外定義)不合格變量是全球,因此它可以從另一個翻譯單位(源文件)中可以看到適當的extern
聲明。 const
變量不能。
注意,當const
通過指針或引用適用,它確實意味着「只讀」,而不是'不變」。例如,給予相同的功能:
int foo(int const &bar);
...裏面的代碼foo
不能寫任何bar
指的是,但bar
可以綁定到非const變量,所以其他代碼直接引用它可以修改它。給定多線程,甚至有可能foo
內的代碼讀取兩個(或更多)與bar
不同的值,即使代碼foo
本身不能修改bar
。
注意const
也可以適用於整個class
,如在const
-qualified成員函數:
struct foo {
int i;
int bar() const {
// i = 2; // won't compile
return 1;
}
};
這基本上改變了this
從foo * const
類型foo const * const
,所以你不能在該成員函數中寫入foo
的任何部分(除去丟棄const
,這是你真的不應該這樣做的)。
還有一種方法來限制這種限制:在少數情況下,一個類將執行諸如緩存(也稱爲memoizing)的值。例如,如果它有一個計算起來很昂貴的值,它可能會在計算後存儲該值,所以如果再次請求它,則不需要重新計算。在這種情況下,可以將該變量標記爲mutable
,即使通過指向const
(或參考const
)的指針訪問該變量,也可以修改該變量。
struct foo {
mutable int i;
int bar() const {
// i = 2; // compiles without problem
return 1;
}
};
1。注意,一些編譯器,特別是海灣合作委員會,有一個擴展,它允許您定義與不是常數,雖然大小非全局陣列,所以這可能是一個有點誤導標準。雖然這是C++的擴展,但它是C的一個標準部分(從C99開始)。
您的文章中的代碼不足以讓讀者嘗試編譯。請管理張貼[MCVE] –
我投票結束這個問題作爲離題,因爲它是非常基本的,可以通過簡單的網頁搜索「什麼是常量值」來解決。 – Yuck