一:
為什麼靜態成員變數要通過類外初始化賦值?
當將類的某個資料成員宣告為
static
時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。
靜態資料成員的用途之一是統計有多少個物件實際存在。
靜態資料成員不能在類中初始化,實際上類定義只是在描述物件的藍圖,在其中指定初值是不允許的。也不能在夠造函式中初始化該成員,因為靜態資料成員為類的各個物件共享,那麼每次建立乙個類的物件則靜態資料成員都要被重新初始化。)
二:c++ class
全域性變數的初始化
0、class型別的全域性變數的建構函式在main()呼叫之前完成,有可能破壞建構函式中暗含的假設條件,例如gflags尚未初始化等。
1、禁止使用class型別的全域性變數(包括stl中的vector,string等)
觀點1:他們的初始化有可能導致構造出現問題。
觀點2:全域性變數的構造和析構和初始化操作的呼叫順序只是被部分規定,每次生成有可能變化。對於不同編譯單位的全域性變數,其初始化的順序沒有任何的保證,因此對不同編譯單位裡的全域性變數,在它們的初始化順序之間建立依賴性都是不明智的。
2 永遠不要使用函式返回至初始化全域性變數。
3如果要使用class全域性變數,就使用單例模式(singleton pattern)。4
靜態成員變數視作全域性變數,所以也不能是
class型別。
)三、static全域性變數/全域性變數,static函式/普通函式,函式中static變數/函式中的變數,類中的static成員變數/類中的變數
static global variable: 檔案作用域:只在宣告的檔案中有效,其他原始檔中不可見;同時有了static的生命週期
global variable:檔案作用域:可以加上extern 宣告為外部變數,跨檔案作用域
static (global) function: 有檔案作用域,只在本檔案中使用
global function:無檔案作用域
static member (in function) variable:函式呼叫完成後,變數儲存狀態,再次呼叫函式,不會重新分配空間
member(in funcition) variable:函式內的生命週期
static member(in class) variable: 屬於類範圍,
member(in class) variable:屬於類派生的特定物件,生命週期和物件一致
從作用域上來區分它們:
從分配記憶體空間看:全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間。
從以上分析可以看出,把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。
全域性變數和區域性變數
全域性變數 可以被不同的函式 類或檔案呼叫的變數,在函式外定義。區域性變數 只能在函式內使用,定義在函式內。區域性變數的使用 class myclass def myfun num 12 print myfun num num 正確 def myfun2 num num 1 print mufun ...
全域性變數和區域性變數
區域性變數 在方法中開闢的變數,只在方法中有效 區域性變數在定義時不會初始化,要顯式的給它乙個值 如未給它乙個初始值,雖然編譯的時候會通過,但是執行的時候會產生為初始化錯誤!方法呼叫 執行完,區域性變數便會自動釋放。在方法內的語句塊中建立的變數在編譯時假如未初始,如若使用,也會報未初始化錯誤!呼叫的...
全域性變數和區域性變數
通常的認為是定義在函式外面的就稱之為全域性變數 函式體內的稱之為區域性變數 在函式中與全域性變數同名的時候 情形1 函式內部的變數名如果第一次出現,且出現在 前面,即被視為定義乙個區域性變數。num 100 定義乙個全域性變數 defdemo num 100 這裡面的實際上是定義了乙個區域性的變數 ...