C++ 全局變量和局部變量


一:為什么靜態成員變量要通過類外初始化賦值?

當將類的某個數據成員聲明為static時,該靜態數據成員只能被定義一次,而且要被同類的所有對象共享。各個對象都擁有類中每一個普通數據成員的副本,但靜態數據成員只有一個實例存在,與定義了多少類對象無關。

靜態數據成員的用途之一是統計有多少個對象實際存在。

靜態數據成員不能在類中初始化,實際上類定義只是在描述對象的藍圖,在其中指定初值是不允許的。也不能在夠造函數中初始化該成員,因為靜態數據成員為類的各個對象共享,那么每次創建一個類的對象則靜態數據成員都要被重新初始化。)

 

二:C++ class 全局變量的初始化

0class類型的全局變量的構造函數在main()調用之前完成,有可能破壞構造函數中暗含的假設條件,例如gflags尚未初始化等。

1禁止使用class類型的全局變量(包括STL中的vector,string等)

     觀點1:他們的初始化有可能導致構造出現問題。

     觀點2:全局變量的構造和析構和初始化操作的調用順序只是被部分規定,每次生成有可能變化。對於不同編譯單位的全局變量,其初始化的順序沒有任何的保證,因此對不同編譯單位里的全局變量,在它們的初始化順序之間建立依賴性都是不明智的。

2 永遠不要使用函數返回至初始化全局變量。

3 如果要使用class全局變量,就使用單例模式(singleton pattern)。

 靜態成員變量視作全局變量,所以也不能是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:屬於類派生的特定對象,生命周期和對象一致

從作用域上來區分它們:

  1. 全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變量定義的源文件需要用extern 關鍵字再次聲明這個全局變量。
  1. 局部變量也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束后,變量被撤銷,其所占用的內存也被收回。
  1. 靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和全局變量的區別在於全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。
  1. 靜態全局變量也具有全局作用域,它與全局變量的區別在於如果程序包含多個文件的話,它作用於定義它的文件里,不能作用到其它文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。


從分配內存空間看:全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧里分配空間。
從以上分析可以看出,把 局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: