非靜態函式,非靜態變數與靜態函式,靜態變數
一、函式
函式的引入可以減少程式的目標**,實現程式**的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式**執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢復現場,並按原來儲存的位址繼續執行。對於較長的函式這種開銷可以忽略不計,但是對於一些函式體**很短,但又被頻繁地呼叫的函式,就不能忽視這種開銷。引入內聯函式和巨集函式正是為了解決這個問題,提高程式的執行效率。 在程式編譯時,編譯器將程式中出現的內聯函式(巨集函式)的呼叫表示式用內聯函式(巨集函式)的函式體來進行替換。由於在編譯時將函式體中的**替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間開銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。
在類靜態資料成員不同於非靜態的資料成員,乙個類的靜態資料成員僅建立和初始化一次,且在程式開始執行的時候建立,然後被該類的所有物件共享;而非靜態的資料成員則隨著物件的建立而多次建立和初始化; static成員是放在靜態儲存區的,它並不受訪問控制符的限制,而其它的成員變數則是放在棧中的。
二、使用方面
1:windows的**函式使用靜態函式:
在類中,static型的成員函式,由於是類所擁有的,而不是具體物件所有的,這一點對於windows的**機制非常有用。因為對於**函式而言,windows不會借助任何物件去呼叫它,也就不會傳遞this指標,那麼對於一般成員函式作為**函式的後果,就是堆疊中有乙個隨機的變數會成為this指標,這當然會引發程式的崩潰。而static函式,由於是整個類的,遮蔽了this指標。因此,如果成員函式作為**函式,就應該用static去修飾它。
2:執行緒控制函式常使用靜態函式
靜態函式有特定的位址空間,這樣可以避免在執行時system對記憶體調整帶來的問題。
3:windows系統api,也常使用靜態函式
呼叫方面,不用在呼叫前例項化。
三、例項**
#include "stdafx.h"
#include
#include
#include
class directory
static void setpath(char const *newpath);
static void setname( directory *dir);
void getpath(char *oldpath);
char strtemp [50];
int i;
private:
//靜態字串
static char path ;
};//靜態資料成員的初始化
char directory::path [199] = "/開始測試";
// 靜態函式訪問靜態變數
void directory::setpath(char const *newpath)
//靜態函式訪問非靜態變數
void directory::setname(directory *dir)
// 非靜態函式訪問靜態變數
void directory::getpath(char *oldpath)
// 使用例項
void main()
非靜態函式,非靜態變數與靜態函式,靜態變數
一 函式 函式的引入可以減少程式的目標 實現程式 的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式 執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢復現場,並按原來儲存的位址繼續執行。對於較長...
靜態函式與非靜態函式的區別
靜態成員函式和非靜態成員函式的根本區別在於有無this指標。非靜態函式由物件名或者物件指標 呼叫,呼叫時編譯器會向函式傳遞this指標 靜態成員函式則由類名 或者物件名呼叫 非靜態函式中有this指標,靜態函式中沒有this指標,不能訪問物件的成員函式,成員函式有this指標,const修飾this...
靜態變數和靜態函式
靜態變數 靜態變數使用 static 修飾符進行宣告 在所屬類被裝載時建立 通過類進行訪問 所屬類的所有例項的同一靜態變數都是同乙個值 非靜態變數 不帶有 static 修飾符宣告的變數稱做非靜態變數 在類被例項化時建立 通過物件進行訪問 同乙個類的不同例項的同一非靜態變數可以是不同的值 在c 中,...