筆記八:靜態變數、靜態成員函式、函式指標、靜態函式指標
靜態變數
1、靜態變數的儲存方式和生命週期:屬於靜態儲存方式,其儲存空間為記憶體中的靜態資料區,該區域的資料在整個程式的執行期間不會釋放,所以其生命週期為整個程式執行時間段。
2、靜態區域性變數:定義在函式體內的變數。當對靜態區域性變數進行初始化時,只初始化一次,且必須是常量或常量表達式。
3、全域性變數與靜態全域性變數:全域性變數即是靜態變數,兩者的區別是作用域不同。非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在所有原始檔中都是有效的。而靜態全域性變數只在定義該變數的原始檔內有效,可以增加安全性和避免不同原始檔同變數名衝突問題。
4、記憶體分割槽
1)c++中記憶體分割槽為:堆、棧、自由儲存區、全域性/靜態儲存區、常量儲存區
2)棧:編譯器在需要的時候分配,在不需要的時候自動清除或釋放變數的儲存區,裡面的變數通常是區域性變數或函式引數
3)堆:由new分配的記憶體塊,由程式中的delete釋放,編譯器不管。若程式只new沒有主動delete,則至到程式結束才釋放掉該記憶體。
4)自由儲存區:由malloc分配,由free釋放,與堆類似。
5)全域性/靜態儲存區: 全域性變數和靜態變數的佔用記憶體區
5)常量儲存區: 存放常量
靜態成員函式
1、非static成員和static成員的區別:非static資料成員存在於類型別的每個物件中,而static資料成員獨立於該類的任意物件存在。static資料成員可以實現同類的多個物件例項的資料共享,在記憶體中只佔一份空間。static資料成員必須在類定義體的外部定義,形如A::x=3,而不是在類建構函式中初始化。
2、static成員函式:是類的組成部分,但不是任何物件的組成部分,不需要例項化類也可以呼叫,形如A::fun()。因為this指標要例項化類後與例項物件關聯,故static函式無this指標。可以訪問所屬類的static成員但不能使用非static成員。
3、static優勢舉例:
1)可以實現某些設計模式,如Singleton
2)由於沒有this指標,可以把系統API的回撥函式以靜態函式的形式封裝到類的內部。例如執行緒的建立之類
3)可以封裝某些演算法,如數學函式sin、cos等,其並不依靠哪一個例項物件存在。節約時間和記憶體。
函式指標
1、定義: 每一個函式都佔用一段記憶體單元,它們有一個起始地址,指向函式的入口地址的指標稱為函式指標
2、語法: 資料型別(*指標變數名)(引數表) 。
3、區別:
int(*p)(int a, int b)
p是一個指向函式的函式指標變數,返回值型別為int。int *p(int a, int b)
p是函式名,此函式的返回值型別為整型指標。 4、指向函式的指標變數不是固定指向哪一個函式的,而只是表示定義了一個這樣的指標型別,用來專門存放函式的入口地址,在程式中把哪一個函式的地址賦給它,它就指向哪一個函式。
5、在給函式指標變數賦值時,只需給出函式名,而不必給出引數:
int max(int x, int y); int (*p)(int a, int b); p=max;
。 6、用途:用作呼叫函式和函式引數。
靜態函式指標
1、由於靜態成員函式無法呼叫非靜態成員,故靜態函式指標對應靜態函式。