靜態函數會被自動分配在一個一直使用的存儲區,直到退出應用程序實例,避免了調用函數時壓棧出棧,速度快不少。
關鍵字「static」,譯成中文就是「靜態的」,因此內部函數又稱靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的做用域僅侷限於本文件。 使用內部函數的好處是:不一樣的人編寫不一樣的函數時,不用擔憂本身定義的函數,是否會與其它文件中的函數同名,由於同名也沒有關係。
c語言中static的語義1.static變量:1).局部a.靜態局部變量在函數內定義,生存期爲整個源程序,但做用域與自動變量相同,只能在定義該變量的函數內使用。退出該函數後, 儘管該變量還繼續存在,但不能使用它。b.對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。2).全局全局變量自己就是靜態存儲方式, 靜態全局變量固然也是靜態存儲方式。可是他們的做用域,非靜態全局 變量的做用域是整個源程序(多個源文件能夠共同使用); 而靜態全局變量則限制了其做用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。2.static函數(也叫內部函數)只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用。區別於通常的非靜態函數(外部函數) static在c裏面能夠用來修飾變量,也能夠用來修飾函數。 先看用來修飾變量的時候。變量在c裏面可分爲存在全局數據區、棧和堆裏。其實咱們平時所說的堆棧是棧而不包含對,不要弄混。函數
2.C++程序的靜態變量和函數this
2.1 靜態成員函數spa
(1)靜態成員函數一般用於處理類的靜態成員變量。實際上,對於類的成員函數來講,若是它不能訪問類的任何非靜態成員,則應該將該函數變成靜態成員函數。.net
(2)對靜態成員函數的調用,一般經過使用做用域解析運算符將函數名稱鏈接到類名來完成。若是已經定義了類的對象,那麼靜態成員函數也能夠經過使用點運算符將它們的名稱鏈接到對象來調用。指針
(3)this 指針不能在靜態成員函數中使用,由於靜態成員函數不是經過它們所屬類的任何實例調用的。並且,靜態成員函數除非指定該成員屬於哪一個實例,不然不能訪問其類的實例成員。例如,來看如下類定義語句:code
class StatAccessorm
{對象
private:blog
int x;ip
public:
static void output()
{
cout << x; //對非靜態成員的不正確訪問
}
StatAccess(int x) { this->x = x; }
};
在語句 cout<<x
中試圖訪問 x 是不正確的,由於它等於隱式使用 this 指針,而這是靜態函數 output 所不具備的。相反,在如下修改過的同一個類的示例中,靜態成員函數 print 正確地訪問了非靜態成員 x,由於它使用了傳遞給它的類對象的名稱做爲形參來限定它。
class StatAccess
{
private:
int x;
public:
static void print(StatAccess a)
{
cout << a.x;
}
StatAccess(int x) { this->x = x; }
};
靜態成員函數的一個優勢是能夠在任何類的實例被建立以前調用它們,這使得它們能夠用來執行復雜的初始化任務,這些任務必須在建立類的對象以前完成。
C++ 使用關鍵字 Static 來描述靜態類成員函數。要理解其中原委,能夠看一看實例與靜態類成員之間的區別。類的每一個對象都有它本身的實例成員的副本,可是全部的對象都共享相同的靜態成員。
與此類似的是,每次調用函數都有其本身的非靜態局部變量的副本,可是全部的函數調用都共享相同的靜態局部變量。