理解C++ static

Andy Niu發表於2013-11-07

1、為什麼設計static?考慮下面的需求:

  在程式執行過程中,在一個範圍內,有一個物件大家共享,而且可以多次使用,狀態能夠保持,物件的生命週期一直持續到程式執行結束。

2、靜態物件要分配在全域性資料區,程式執行期間,不能釋放,一直到程式終止。

3、靜態物件的生命週期是程式的整個執行過程。但是可以限定靜態物件的作用域,根據作用域的大小,可分為靜態區域性物件,靜態全域性物件。靜態區域性物件是指方法內的靜態物件,靜態全域性物件是指編譯單元裡的靜態物件。(注意:生命週期是時間概念,作用域是空間概念)

4、靜態物件只能初始化一次。嚴格來講,任何物件都只能初始化一次,而且是在定義的時候。後面再想修改物件的值,只能通過賦值操作。什麼叫初始化,什麼叫賦值?初始化是指建立物件的時候(也就是定義的時候),給物件設定初始值。賦值是指物件已經存在值了,擦除當前值,使用新值代替。任何物件都只建立一次,也就是初始化一次。

5、那為什麼方法內的區域性物件可以初始化多次呢?

  實際上,方法內的物件也只是初始化一次。第一次呼叫方法,初始化物件,方法退出,物件銷燬。第二次呼叫方法,又初始化物件,但是,這時的物件不是第一次呼叫時的物件,而且沒有任何關係。

6、C++可以宣告多次,只能定義一次,但是有一些例外。static就是一例,static可以在多個編譯單元裡定義,這是因為static是內部連結。全域性static的作用域是當前的編譯單元。不同編譯單元都有專屬於自己的一份static物件,而且彼此沒有關係,不會保持相同的值。

7、對於類,標頭檔案是對類的定義,但是是對類的成員的宣告。類中static成員,在類定義中宣告,在類定義外,需要定義,也就是初始化。類中static成員的作用域是當前類,所有類物件共享。

8、宣告:是說我有這個東西。

     定義:建立這個東西,並初始化,說明這個東西就在這裡。

9、基本型別物件:

  static物件,定義的時候,沒有顯示初始化,會被隱式初始化為0或者null,動態物件(方法內的物件,在棧上分配)定義的時候,沒有顯示初始化,可以認為隱式初始化為一個隨機值。

相關文章