回答
我不知道,但我的猜測是,因爲裏面類成員變量只聲明。它們通過構造函數或其他成員函數進行初始化。
這發生在對象被實例化時。但是對於靜態成員,這些對象不需要實例化。因此,他們需要在課外進行一次初始化。
編輯:
其實這是沒有必要的初始化靜態變量,但它是必要的定義它們的類外爲他們分配內存。只有在它們的定義之後,它們才能被初始化,然後在程序中使用。
1.此處輸出值i不是初始化值。 #include
在類中聲明時未分配內存。內存在實際定義在類之外時進行分配。 –
在你提到的代碼中,當對象通過構造函數實例化時,變量i被初始化,而不是在類中聲明的時候。 –
宣言在類中只聲明該範圍內的變量。 定義實際分配內存。
你使用它的類函數中,因爲它在該範圍內定義。對象創建時不會發生靜態變量初始化,而是在應用程序啓動時發生。
因爲靜態變量需要在某處分配一些存儲空間。
讓我們藉此例如:
struct Example
{
static int counter;
Example() { counter++; }
};
,只要你想你可以創建許多Example
情況,但只有將永遠是一個Example::counter
變量。它基本上是一個變相的全球變量。但它住在哪裏?回到C++的早期階段,Stroustrup決定解決這個問題的方法是明確選擇一個翻譯單元(即.cpp
文件)並在那裏聲明它,就像你將一個「真正的」全局變量一樣。所以,你需要做的是這樣
// Only in one .cpp file
int Example::counter = 0;
(當然,後來的模板被髮明的,弱符號和他們一起去,這可能已經解決了這個尷尬的混亂,但爲時已晚,屆時。)
由於靜態成員是在一個類的所有實例之間共享的,所以它們必須在唯一的一個地方定義。真的,它們是具有一些訪問限制的全局變量。
如果試圖在標題中定義它們,它們將每一個包括頭模塊中進行定義,並鏈接它找到的所有重複定義的過程中你會得到錯誤。
是的,這至少部分是從cfront開始的歷史問題;可以編寫一個編譯器來創建一種隱藏的「static_members_of_everything.cpp」並鏈接到該文件。但是,它會打破向後兼容性,這樣做沒有任何實際的好處。
- 1. 爲什麼我們要在普通類中聲明靜態類?
- 2. Django - 爲什麼模型類中聲明的變量靜態
- 3. 爲什麼我們被限制在java的內部類中聲明靜態成員變量?
- 4. 爲什麼我們可以從外部類訪問內部類中的變量?
- 5. 在Java中的非靜態類中聲明靜態變量
- 6. 爲什麼我們不能在靜態內部類中定義主函數?
- 7. 爲什麼我們不能有靜態外部類
- 8. 在Swift類或結構中聲明爲靜態的變量會發生什麼?
- 9. 在類之外聲明的靜態變量
- 10. 在類之外聲明一個新的靜態變量
- 11. 爲什麼這個對象聲明在node.js中工作以及如何聲明一個靜態變量?
- 12. PHP - 爲什麼我無法聲明靜態常量變量?
- 13. 爲什麼靜態變量需要在C++中聲明兩次
- 14. 爲什麼我們使用靜態類變量?
- 15. 爲什麼我們不能將常量變量定義爲靜態變量?
- 16. 爲什麼我們在java中聲明變量爲private
- 17. 爲什麼我不能在類聲明之外初始化非靜態成員?
- 18. 爲什麼我不能聲明一個參數化的靜態類變量?
- 19. 爲什麼不能在類中聲明const靜態字符串
- 20. 在非靜態類中聲明一個靜態方法的意義是什麼?
- 21. 類變量聲明及其在角4
- 22. 聲明在靜態類
- 23. 爲什麼不能在非靜態塊中聲明靜態最終變量?
- 24. 在javascript中爲什麼我們使用var來聲明變量?
- 25. 什麼是Ruby的類似Python的變量,未在類定義中聲明?
- 26. 爲什麼我不能在TypeScript類中聲明局部變量和函數?
- 27. 爲什麼靜態成員函數只能在類定義中聲明爲靜態而不是在其自己的定義中聲明?
- 28. 如何在PHP類中聲明靜態變量,但是在擴展基類的類中定義它?
- 29. 在外部聲明變量
- 30. 聲明靜態變量時的輸出是什麼?爲什麼?
聲明和定義之間的C++有一個普遍的區別。在某些情況下,可以同時進行這兩種操作,但這不是其中之一。 – EJP