靜態局部變量有以下特點:
1.該變量存放在靜態存儲區,直到程序運行結束才被銷毀。但其作用域為局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束
2.塊作用域的靜態變量,在首次進入到定義該靜態變量的函數時,構造該變量,以後進入該函數時不再構造該變量了
3.靜態局部變量一般在聲明處初始化,如果沒有顯示初始化,程序會默認給它初始化為0.
靜態全局變量有以下特點:
1.該變量存放在靜態存儲區,局部於源文件的變量,嚴格的講作用域應該是定義之處開始到本文件結束
2.初始化:如果不顯示初始化的話,那麼程序默認給他初始化為0.
3.注意:文件作用域下聲明的const常量默認為static。
靜態函數有以下特點:
1.靜態函數局部於源文件,它只能在本源文件中被使用(這是與普通的函數的區別)
2.注意;在文件作用域下聲明的inline函數默認為static 類型.
靜態數據成員有以下特點:
1.因為其靜態數據成員空間在靜態存儲區分配,被所有本類的對象共享,所以,它屬於類,而不屬於特定的對象,
在沒產生類對象時其作用域就可見,即在沒有產生類的實例時,我們就可以操作它。
因為程序一開始運行就必需存在,系統就分配好了內存,它不由構造函數來分配內存空間,所以它與對象無關,故可以節省內存,
提高效率
2.靜態數據成員在類中只是聲明,要在類外給予定義並初始化。程序不會默認給靜態數據成員初始化的。
3.訪問方式:
類類型名:靜態數據成員名(建議采用這種方式)
類對象名.靜態數據成員名
靜態成員函數有以下特點:(靜態成員函數的很多好處都是基於與類的實例無關,只與類有關,沒有this指針)
1.靜態成員函數的特性與靜態數據成員類似,同樣是與對象無關,只與類本身有關。
2.靜態成員函數沒有this指針,靜態成員函數一般用於訪問操作靜態數據成員的。
3.靜態成員函數可以在構造函數初始化期間使用,用於傳遞某些信息給非靜態成員,進而初始化
4.靜態成員函數沒有this指針,所以就差不多等同於nonmember函數,結果就產生了一個意想不到
的好處:成為一個callback函數,使得我們得以將C++和C-based X Window系統結合,同時也成功的應用於線程函數身上,
可以把某些系統API的回調函數以靜態函數的形式封裝到類的內部。
5.訪問方式:
類類型名:靜態數據成員函數名(建議采用這種方式)
類對象名.靜態數據成員函數名
6.單例模式策略:
1.將構造函數聲明為private,禁止用戶自己構造對象。定義一個靜態成員函數,在函數內部定義一個靜態對象,返回該對象的引用或指針。
2.要保證不能復制和賦值操作,將這兩個函數的聲明聲明為private就夠了。
7.總之,從OOA/OOD的角度考慮,一切不需要實例化就可以有確定行為方式的函數都應該設計成靜態的。
以上只是一些基本的考慮,並不是絕對的。絕對東西的只有一點:“靜態函數不需要實例化就可以被調用,不會也不可以調用或操縱非靜態成員”。
記住這一點,那麼實際編程中何時需要用,何時適合用,自然就更容易作出決定了。
非靜態成員函數可以訪問靜態成員函數。原因是:非靜態成員函數帶有this指針,他可以訪問任意的成員
靜態成員函數不可以訪問非靜態成員函數。原因是:靜態成員函數沒有this指針
在基類中定義了靜態數據成員的話,則基類的所有對象和派生類的所有對象共享該數據成員。
派生類對象不想與基類對象共享基類的靜態成員的話,則派生類需要屏蔽基類的靜態成員。
方法是:在派生類中重定義該成員,實現派生類對象不與基類對象共享基類的靜態數據成員 ,因為我們的編譯器采用了一種絕妙的手法:name-mangling
用以生成唯一的標志。但如果屏蔽共享功能時,又需要用基類的靜態成員數據的話,則用作用域域運算符來訪問基類的該成員