c 為什麼不隱式地定義類靜態成員?

時間 2021-05-06 19:20:24

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 朱涵俊 靜態成員函式跟靜態函式沒區別,就是乙個作用域不同而已。可以看成普通的非成員函式。成員函式在傳引數時候...

其他用戶還看了: