1樓:靈劍
跟編譯鏈結過程有關係,像靜態成員這種會在靜態區分配空間的,編譯的時候必須要建立乙個符號,鏈結的時候把不同檔案裡的符號指向同乙個位置,以前必須有乙個檔案是實際分配空間,其它檔案只引用不分配,所以有宣告和定義的區別。現在有弱符號的功能了,就可以實現inline也就是宣告的同時定義了。
2樓:
因為編譯和鏈結是分開的。編譯的過程將每個原始檔編譯。標頭檔案只做預處理幷包含在原始檔裡。
在鏈結的時候才會分配類內靜態變數的位址。如果在類內對靜態變數賦值不容易區分那個原始檔應該作為宣告,那個原始檔作為定義。說的不對請告訴我。
3樓:Milo Yip
我估計你的問題是,為什麼在類定義中宣告了靜態成員變數,還需要在類之外定義這些變數。以下假設問題是這個意思。
可以考慮一下,其實類定義中宣告的成員函式,也是需要在類外定義的。只有非靜態成員變數不需要在類外定義,因為它們是在例項化乙個的時候生成的。
如果成員函式適合內聯,就可以把函式體也寫到類定義中,還可以省去 `inline`。
而靜態成員變數要寫兩次,的確很多人都覺得很麻煩,所以在 C++17 加入了內聯靜態成員變數,只要在宣告成員變數時, 在`static`前加入 `inline`,就能順便定義了它,還可初始化它,這就不用在類外定義了。
4樓:
「靜態成員加static」和「非靜態成員加nonstatic」本質上是一樣的。
那麼你覺得是靜態成員多一些還是非靜態成員多一些?
它們和人們常說的「編譯器隱式行為」不是一回事。後者通常是指隱式生成的拷貝移動構造析構函式。
C 為什麼Random類不做靜態?
程子昂 這保證每個Random例項都是乙個固定的偽隨機數生成器 PRNG 也就是說兩個Random例項如果用同乙個隨機數種子的話生成的隨機數序列是一樣的 預設的種子是系統時間 這個性質在某些地方會很有用,譬如密碼學裡的對稱流加密就可以用PRNG實現 總這個角度講Random其實也不太安全,RNGCy...
c 靜態成員函式為什麼不能為虛函式?
Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...
為什麼C 中 void 能指向靜態成員函式但不能指非靜態向成員函式?
檀十一郎 讓我們來強行搞編譯器一波 class A fp A a A pa a pa fp.fpa fp.fp void 因為A test沒用到this,所以這麼搞也能工作。return 0 朱涵俊 靜態成員函式跟靜態函式沒區別,就是乙個作用域不同而已。可以看成普通的非成員函式。成員函式在傳引數時候...