1. 程式人生 > >c++中靜態函式與動態函式的區別

c++中靜態函式與動態函式的區別

在C語言中,由於沒有類的概念,所以沒有靜態成員一說,在c中static的作用主要有2個:

一是隱藏功能,對於static修飾的函式和全域性變數而言
二是保持永續性功能,對於static修飾的區域性變數而言。
並且,因為存放在靜態區,全域性和區域性的static修飾的變數,都預設初始化為0。

C語言中使用靜態函式的好處:
      靜態函式會被自動分配在一個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。 
      關鍵字“static”,譯成中文就是“靜態的”,所以內部函式又稱靜態函式。但此處“static”的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。 使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。 
c語言中static的語義1.static變數:1).區域性a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後, 儘管該變數還繼續存在,但不能使用它。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。2).全域性全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。但是他們的作用域,非靜態全域性 變數的作用域是整個源程式(多個原始檔可以共同使用); 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。2.static函式(也叫內部函式)只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫。區別於一般的非靜態函式(外部函式)     static在c裡面可以用來修飾變數,也可以用來修飾函式。         先看用來修飾變數的時候。變數在c裡面可分為存在全域性資料區、棧和堆裡。其實我們平時所說的堆疊是棧而不包含對,不要弄混。

在c++中,由於面向物件的思維,它與C語言中的作用有一些不同,有了類中靜態成員的說法。靜態成員不屬於物件,而屬於類。不建立物件也可呼叫。從程式碼形式上來說沒有任何區別。普通類成員函式與靜態成員函式的區別在於普通成員函式有一個隱藏的呼叫引數(this)指標。所以就是說靜態成員函式沒有物件也可呼叫。但他們都是在編譯期就進行地址繫結的。虛擬成員函式與他們的區別在於虛擬函式是物件生成時有物件的虛表決定的(所以是動態的)。

對類的靜態和非靜態函式的不同的呼叫要求決定了它們在使用上的方便程度:非靜態成員函式要通過物件呼叫,所以要求首先建立一個物件;而靜態成員函式可不建立物件就可以被使用。因此,與類的非靜態資料成員無關的成員函式,雖然可以被定義為非靜態函式,但是如果定義為靜態函式的話在使用上會更加方便。
另外,如果類的成員函式想作為回撥函式來使用,一般情況下只能將它定義為靜態成員才行。

C++類中的靜態成員有一個非常好的功能,那就是無論類定義了多少個物件,這些物件始終都共同使用這一個靜態成員


例如:  class A{ 

 static int num;

A(){num++}     } 

int A::num=0; 

 就會有如下效果:  A  a,b,c,d;     cout<<a.num<<","<<b.num<<","<<c.num<<","<<d.num    輸出 4,4,4,4

可以看出,在每個物件中的num成員都只有一個副本。在記憶體中也是如此,初始化abcd時並沒有分配新的記憶體。

在使用靜態成員的過程中還有以下幾點注意:

1.num不可以在類中初始化,更不可以在建構函式或建構函式初始化表中初始化。必須在類外初始化。方法是:

int A::num=0;    此時不能有物件被定義,也就是說縣定義num才可以,定義a b等

2.如果num為public成員,那麼任何時候都可以這樣呼叫它 A::num  當然 a.num也可以


對於靜態成員函式,它的特點和靜態資料成員相似但也有不同:

class A{ 
int num; 
A(){num++}   

static int p(){return num;  }      }//wrong 


1.可以在類中定義。這一點與靜態資料成員不同

2.若p()為public成員,則可以這樣呼叫A::p()。這一點與靜態資料成員相同。

3.靜態成員函式不屬於任何一個特定的物件,所以不存在隱含的this指標。如果要在函式中訪問某個特定的物件的成員,必須結合使用操作符“.”或“->”來顯示地制定所屬物件。


4上面所給的程式是錯誤的因為num不屬於所有的物件。如果num是靜態的則可以。


靜態成員函式常用來操作靜態資料成員。