非靜態函式,非靜態變數與靜態函式,靜態變數

2021-05-07 13:49:32 字數 1613 閱讀 6165

非靜態函式,非靜態變數與靜態函式,靜態變數

一、函式

函式的引入可以減少程式的目標**,實現程式**的共享。但是,函式呼叫也需要一些時間和空間方面的開銷,因為呼叫函式實際上將程式執行流程轉移到被調函式中,被調函式的程式**執行完後,再返回到呼叫的地方。這種呼叫操作要求呼叫前保護現場並記憶執行的位址,返回後恢復現場,並按原來儲存的位址繼續執行。對於較長的函式這種開銷可以忽略不計,但是對於一些函式體**很短,但又被頻繁地呼叫的函式,就不能忽視這種開銷。引入內聯函式和巨集函式正是為了解決這個問題,提高程式的執行效率。   在程式編譯時,編譯器將程式中出現的內聯函式(巨集函式)的呼叫表示式用內聯函式(巨集函式)的函式體來進行替換。由於在編譯時將函式體中的**替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間開銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。

在類靜態資料成員不同於非靜態的資料成員,乙個類的靜態資料成員僅建立和初始化一次,且在程式開始執行的時候建立,然後被該類的所有物件共享;而非靜態的資料成員則隨著物件的建立而多次建立和初始化; 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 中,...