筆記八:靜態變量、靜態成員函數、函數指針、靜態函數指針

靜態變量

http://www.cnblogs.com/dongzhiquan/archive/2009/07/21/1994792.html 一文對靜態變量進行了充分的闡述,現整理部分重要內容如下,加深印象。

1、靜態變量的存儲方式和生命週期:屬於靜態存儲方式,其存儲空間爲內存中的靜態數據區,該區域的數據在整個程序的運行期間不會釋放,所以其生命週期爲整個程序運行時間段。

2、靜態局部變量:定義在函數體內的變量。當對靜態局部變量進行初始化時,只初始化一次,且必須是常量或常量表達式。

3、全局變量與靜態全局變量:全局變量即是靜態變量,兩者的區別是作用域不同。非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在所有源文件中都是有效的。而靜態全局變量只在定義該變量的源文件內有效,可以增加安全性和避免不同源文件同變量名衝突問題。

4、內存分區
1)c++中內存分區爲:堆、棧、自由存儲區、全局/靜態存儲區、常量存儲區
2)棧:編譯器在需要的時候分配,在不需要的時候自動清除或釋放變量的存儲區,裏面的變量通常是局部變量或函數參數
3)堆:由new分配的內存塊,由程序中的delete釋放,編譯器不管。若程序只new沒有主動delete,則至到程序結束才釋放掉該內存。
4)自由存儲區:由malloc分配,由free釋放,與堆類似。
5)全局/靜態存儲區: 全局變量和靜態變量的佔用內存區
5)常量存儲區: 存放常量


靜態成員函數

http://blog.csdn.net/imj060336/article/details/6870985 一文針對靜態成員函數的意義進行了講解,現摘錄學習如下:

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、由於靜態成員函數無法調用非靜態成員,故靜態函數指針對應靜態函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章