2017-05-09 27 views
3

在C++中,標記爲static的成員由給定類的所有實例共享。無論是否爲私有都不會影響一個變量由多個實例共享的事實。如果有任何代碼會嘗試修改它,那麼在那裏有const會警告你。爲什麼使用靜態const(int/string/..)如果你可以把它設置爲私有?

如果這是嚴格的private,那麼類的每個實例都會得到它自己的版本(儘管有優化器)。這是我讀的here。我的問題是,爲什麼static const int而不是將所需的變量放在private?我知道每個對象都會有自己的,但爲什麼它不好呢?

回答

5

你暗示自己的答案是「優化器儘管」。相信編譯器,並確保清晰。

事實上,你在這裏是正確的,還要注意更強烈的條件,試圖修改聲明爲const的變量的行爲是undefined。所以你不能使用const_cast s和指針& c。

做什麼感覺最自然。是的,它是主觀的,但對於什麼是值得我傾向於使用private自動變量,而不是privatestatic變量(我)這是更對稱,(ii)其是簡單重構爲protectedpublic及(iii)private成員與基地更好地工作成員初始化。

+0

我明白。非常感謝你! – Yanketz

1

我知道每個對象都會得到它自己的,但爲什麼它不好?

因爲如果每個對象都不需要它自己的,你就浪費了資源並且做出了一個不能準確表示它的語義的類實現。

另外,static可能在成員不能(例如傳遞給C API)的某些上下文中被引用。

0

定義大多數常量的重點是隻有一個。例如,如果我定義const double pi = 3.14159...;,我當然不希望存在該值的第二個實例。否則,我不得不懷疑a.pi是否與b.pi確實相同。當我知道它被宣佈爲static const時,我確定那a.pi == b.pi。典型的static const值與enum s或位域常數一樣。

另請參閱:BoundaryImposition's建議:非靜態const消耗與非常量數據成員一樣多的內存。如果你沒有聲明你的常量static,那麼你的對象顯着膨脹。

最後,有良好的用例非靜態常量成員:這取決於對象的初始化,但保證了對象的生命週期期間不改變。因此,下面的

const int before = a.nonStaticConstant; 
a.modify(); 
assert(a.nonStaticConstant == before); 

可以合理地預期成功(我們所說的C++,那麼一切皆有可能,包括常量改變!),即使a.nonStaticConstant == b.nonStaticConstant很可能會失敗。

相關問題