1. 程式人生 > >筆記八:靜態變數、靜態成員函式、函式指標、靜態函式指標

筆記八:靜態變數、靜態成員函式、函式指標、靜態函式指標

靜態變數

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、由於靜態成員函式無法呼叫非靜態成員,故靜態函式指標對應靜態函式。