下面是C++中static的用法,C語中類似,只是沒有不用管與類相關的.

創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設、網(wǎng)站重做改版、翁源網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5場景定制、成都做商城網(wǎng)站、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為翁源等各大城市提供網(wǎng)站開發(fā)制作服務。
C++的static有兩種用法:面向過程程序設計中的static和面向?qū)ο蟪绦蛟O計中的static。前者應用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用。
一、面向過程設計中的static
1、靜態(tài)全局變量
在全局變量前,加上關鍵字static,該變量就被定義成為一個靜態(tài)全局變量。我們先舉一個靜態(tài)全局變量的例子,如下:
//Example 1#include iostream.hvoid fn();static int n; //定義靜態(tài)全局變量void main(){ n=20; coutnendl; fn();}void fn(){ n++; coutnendl;}
靜態(tài)全局變量有以下特點:
該變量在全局數(shù)據(jù)區(qū)分配內(nèi)存;
未經(jīng)初始化的靜態(tài)全局變量會被程序自動初始化為0(自動變量的值是隨機的,除非它被顯式初始化);
靜態(tài)全局變量在聲明它的整個文件都是可見的,而在文件之外是不可見的;
靜態(tài)變量都在全局數(shù)據(jù)區(qū)分配內(nèi)存,包括后面將要提到的靜態(tài)局部變量。對于一個完整的程序,在內(nèi)存中的分布情況如下圖:
代碼區(qū)
全局數(shù)據(jù)區(qū)
堆區(qū)
棧區(qū)
一般程序的由new產(chǎn)生的動態(tài)數(shù)據(jù)存放在堆區(qū),函數(shù)內(nèi)部的自動變量存放在棧區(qū)。自動變量一般會隨著函數(shù)的退出而釋放空間,靜態(tài)數(shù)據(jù)(即使是函數(shù)內(nèi)部的靜 態(tài)局部變量)也存放在全局數(shù)據(jù)區(qū)。全局數(shù)據(jù)區(qū)的數(shù)據(jù)并不會因為函數(shù)的退出而釋放空間。細心的讀者可能會發(fā)現(xiàn),Example 1中的代碼中將
static int n; //定義靜態(tài)全局變量
改為
int n; //定義全局變量
程序照樣正常運行。
的確,定義全局變量就可以實現(xiàn)變量在文件中的共享,但定義靜態(tài)全局變量還有以下好處:
靜態(tài)全局變量不能被其它文件所用;
其它文件中可以定義相同名字的變量,不會發(fā)生沖突;
您可以將上述示例代碼改為如下:
//Example 2//File1#include iostream.hvoid fn();static int n; //定義靜態(tài)全局變量void main(){ n=20; coutnendl; fn();}//File2#include iostream.hextern int n;void fn(){ n++; coutnendl;}
編譯并運行Example 2,您就會發(fā)現(xiàn)上述代碼可以分別通過編譯,但運行時出現(xiàn)錯誤。 試著將
static int n; //定義靜態(tài)全局變量
改為
int n; //定義全局變量
再次編譯運行程序,細心體會全局變量和靜態(tài)全局變量的區(qū)別。
2、靜態(tài)局部變量
在局部變量前,加上關鍵字static,該變量就被定義成為一個靜態(tài)局部變量。
我們先舉一個靜態(tài)局部變量的例子,如下:
//Example 3#include iostream.hvoid fn();void main(){ fn(); fn(); fn();}void fn(){ static n=10; coutnendl; n++;}
通常,在函數(shù)體內(nèi)定義了一個變量,每當程序運行到該語句時都會給該局部變量分配棧內(nèi)存。但隨著程序退出函數(shù)體,系統(tǒng)就會收回棧內(nèi)存,局部變量也相應失效。
但有時候我們需要在兩次調(diào)用之間對變量的值進行保存。通常的想法是定義一個全局變量來實現(xiàn)。但這樣一來,變量已經(jīng)不再屬于函數(shù)本身了,不再僅受函數(shù)的控制,給程序的維護帶來不便。
靜態(tài)局部變量正好可以解決這個問題。靜態(tài)局部變量保存在全局數(shù)據(jù)區(qū),而不是保存在棧中,每次的值保持到下一次調(diào)用,直到下次賦新值。
靜態(tài)局部變量有以下特點:
該變量在全局數(shù)據(jù)區(qū)分配內(nèi)存;
靜態(tài)局部變量在程序執(zhí)行到該對象的聲明處時被首次初始化,即以后的函數(shù)調(diào)用不再進行初始化;
靜態(tài)局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0;
它始終駐留在全局數(shù)據(jù)區(qū),直到程序運行結束。但其作用域為局部作用域,當定義它的函數(shù)或語句塊結束時,其作用域隨之結束;
3、靜態(tài)函數(shù)
在函數(shù)的返回類型前加上static關鍵字,函數(shù)即被定義為靜態(tài)函數(shù)。靜態(tài)函數(shù)與普通函數(shù)不同,它只能在聲明它的文件當中可見,不能被其它文件使用。
靜態(tài)函數(shù)的例子:
//Example 4#include iostream.hstatic void fn();//聲明靜態(tài)函數(shù)void main(){ fn();}void fn()//定義靜態(tài)函數(shù){ int n=10; coutnendl;}
定義靜態(tài)函數(shù)的好處:
靜態(tài)函數(shù)不能被其它文件所用;
其它文件中可以定義相同名字的函數(shù),不會發(fā)生沖突;
二、面向?qū)ο蟮膕tatic關鍵字(類中的static關鍵字)
1、靜態(tài)數(shù)據(jù)成員
在類內(nèi)數(shù)據(jù)成員的聲明前加上關鍵字static,該數(shù)據(jù)成員就是類內(nèi)的靜態(tài)數(shù)據(jù)成員。先舉一個靜態(tài)數(shù)據(jù)成員的例子。
//Example 5#include iostream.hclass Myclass{public: Myclass(int a,int b,int c); void GetSum();private: int a,b,c; static int Sum;//聲明靜態(tài)數(shù)據(jù)成員};int Myclass::Sum=0;//定義并初始化靜態(tài)數(shù)據(jù)成員Myclass::Myclass(int a,int b,int c){ this-a=a; this-b=b; this-c=c; Sum+=a+b+c;}void Myclass::GetSum(){ cout"Sum="Sumendl;}void main(){ Myclass M(1,2,3); M.GetSum(); Myclass N(4,5,6); N.GetSum(); M.GetSum();}
可以看出,靜態(tài)數(shù)據(jù)成員有以下特點:
對于非靜態(tài)數(shù)據(jù)成員,每個類對象都有自己的拷貝。而靜態(tài)數(shù)據(jù)成員被當作是類的成員。無論這個類的對象被定義了多少個,靜態(tài)數(shù)據(jù)成員在程序中也只有一份拷 貝,由該類型的所有對象共享訪問。也就是說,靜態(tài)數(shù)據(jù)成員是該類的所有對象所共有的。對該類的多個對象來說,靜態(tài)數(shù)據(jù)成員只分配一次內(nèi)存,供所有對象共 用。所以,靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣的,它的值可以更新;
靜態(tài)數(shù)據(jù)成員存儲在全局數(shù)據(jù)區(qū)。靜態(tài)數(shù)據(jù)成員定義時要分配空間,所以不能在類聲明中定義。在Example 5中,語句int Myclass::Sum=0;是定義靜態(tài)數(shù)據(jù)成員;
靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員一樣遵從public,protected,private訪問規(guī)則;
因為靜態(tài)數(shù)據(jù)成員在全局數(shù)據(jù)區(qū)分配內(nèi)存,屬于本類的所有對象共享,所以,它不屬于特定的類對象,在沒有產(chǎn)生類對象時其作用域就可見,即在沒有產(chǎn)生類的實例時,我們就可以操作它;
靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式為:
<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>
類的靜態(tài)數(shù)據(jù)成員有兩種訪問形式:
<類對象名>.<靜態(tài)數(shù)據(jù)成員名> 或 <類類型名>::<靜態(tài)數(shù)據(jù)成員名>
如果靜態(tài)數(shù)據(jù)成員的訪問權限允許的話(即public的成員),可在程序中,按上述格式來引用靜態(tài)數(shù)據(jù)成員 ;
靜態(tài)數(shù)據(jù)成員主要用在各個對象都有相同的某項屬性的時候。比如對于一個存款類,每個實例的利息都是相同的。所以,應該把利息設為存款類的靜態(tài)數(shù)據(jù)成員。這 有兩個好處,第一,不管定義多少個存款類對象,利息數(shù)據(jù)成員都共享分配在全局數(shù)據(jù)區(qū)的內(nèi)存,所以節(jié)省存儲空間。第二,一旦利息需要改變時,只要改變一次, 則所有存款類對象的利息全改變過來了;
同全局變量相比,使用靜態(tài)數(shù)據(jù)成員有兩個優(yōu)勢:
靜態(tài)數(shù)據(jù)成員沒有進入程序的全局名字空間,因此不存在與程序中其它全局名字沖突的可能性;
可以實現(xiàn)信息隱藏。靜態(tài)數(shù)據(jù)成員可以是private成員,而全局變量不能;
2、靜態(tài)成員函數(shù)
與靜態(tài)數(shù)據(jù)成員一樣,我們也可以創(chuàng)建一個靜態(tài)成員函數(shù),它為類的全部服務而不是為某一個類的具體對象服務。靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,都是類的內(nèi)部 實現(xiàn),屬于類定義的一部分。 普通的成員函數(shù)一般都隱含了一個this指針,this指針指向類的對象本身,因為普通成員函數(shù)總是具體的屬于某個類的具體對象的。通常情況下,this 是缺省的。如函數(shù)fn()實際上是this-fn()。但是與普通函數(shù)相比,靜態(tài)成員函數(shù)由于不是與任何的對象相聯(lián)系,因此它不具有this指 針。從這個意義上講,它無法訪問屬于類對象的非靜態(tài)數(shù)據(jù)成員,也無法訪問非靜態(tài)成員函數(shù),它只能調(diào)用其余的靜態(tài)成員函數(shù)。 下面舉個靜態(tài)成員函數(shù)的例子。
//Example 6#include iostream.hclass Myclass{public: Myclass(int a,int b,int c); static void GetSum();/聲明靜態(tài)成員函數(shù)private: int a,b,c; static int Sum;//聲明靜態(tài)數(shù)據(jù)成員};int Myclass::Sum=0;//定義并初始化靜態(tài)數(shù)據(jù)成員Myclass::Myclass(int a,int b,int c){ this-a=a; this-b=b; this-c=c; Sum+=a+b+c; //非靜態(tài)成員函數(shù)可以訪問靜態(tài)數(shù)據(jù)成員}void Myclass::GetSum() //靜態(tài)成員函數(shù)的實現(xiàn){// coutaendl; //錯誤代碼,a是非靜態(tài)數(shù)據(jù)成員 cout"Sum="Sumendl;}void main(){ Myclass M(1,2,3); M.GetSum(); Myclass N(4,5,6); N.GetSum(); Myclass::GetSum();}
關于靜態(tài)成員函數(shù),可以總結為以下幾點:
出現(xiàn)在類體外的函數(shù)定義不能指定關鍵字static;
靜態(tài)成員之間可以相互訪問,包括靜態(tài)成員函數(shù)訪問靜態(tài)數(shù)據(jù)成員和訪問靜態(tài)成員函數(shù);
非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員;
靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)數(shù)據(jù)成員;
由于沒有this指針的額外開銷,因此靜態(tài)成員函數(shù)與類的全局函數(shù)相比速度上會有少許的增長;
調(diào)用靜態(tài)成員函數(shù),可以用成員訪問操作符(.)和(-)為一個類的對象或指向類對象的指針調(diào)用靜態(tài)成員函數(shù),也可以直接使用如下格式:
<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)
調(diào)用類的靜態(tài)成員函數(shù)。
1、修飾變量
變量分為局部和全局變量,但是都存于內(nèi)存的靜態(tài)區(qū)。靜態(tài)全局變量的作用域僅局限于變量被定義的文件中,其他文件即使使用extern也沒法使用,其范圍準確的說是從定義之初開始,到文件結尾處結束。在其前面定義的代碼行也不能使用。
靜態(tài)局部變量,在函數(shù)體里面定義的,就只能在這個函數(shù)里用了,同一個文檔中的其他函數(shù)也用不了。由于被static 修飾的變量總是存在內(nèi)存的靜態(tài)區(qū),所以即使這個函數(shù)運行結束,這個靜態(tài)變量的值還是不會被銷毀,函數(shù)下次使用時仍然能用到這個值。
2、修飾函數(shù)
函數(shù)前加static 使得函數(shù)成為靜態(tài)函數(shù)。但此處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件(所以又稱內(nèi)部函數(shù))。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時,不用擔心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名。
關鍵字static 有著不尋常的歷史。起初,在C 中引入關鍵字static 是為了表示退出一個塊后仍然存在的局部變量。隨后,static 在C 中有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數(shù)。為了避免引入新的關鍵字,所以仍使用static 關鍵字來表示這第二種含義。
有兩種用法:
1、static修飾局部變量,成為一個局部靜態(tài)變量。
static修飾局部變量(靜態(tài)局部變量)與普通局部變量相比,它的優(yōu)勢在于:
①靜態(tài)局部變量作用域與連接屬性與普通局部變量一樣;
②存儲類:靜態(tài)局部變量分配在data/bss段,普通局部變量在棧上;
③生命周期:因為存儲類的不同,靜態(tài)局部變量的生命周期得到延長了,直到程序結束。
2、static修飾全局變量與函數(shù),成為靜態(tài)全局變量與靜態(tài)函數(shù)。
static修飾全局變量\函數(shù) 與 普通全局變量\普通函數(shù)相比,它的優(yōu)勢在于:
①存儲類、生命周期、作用域都一樣;
②差別在于static修飾全局變量\函數(shù)連接屬性是內(nèi)連接,普通全局變量\普通函數(shù)是外鏈接;
③就是說static修飾全局變量\函數(shù)不能跨文件訪問調(diào)用。
擴展資料:
在類內(nèi)數(shù)據(jù)成員的聲明前加上static關鍵字,該數(shù)據(jù)成員就是類內(nèi)的靜態(tài)數(shù)據(jù)成員。其特點如下:
靜態(tài)數(shù)據(jù)成員存儲在全局數(shù)據(jù)區(qū),靜態(tài)數(shù)據(jù)成員在定義時分配存儲空間,所以不能在類聲明中定義
靜態(tài)數(shù)據(jù)成員是類的成員,無論定義了多少個類的對象,靜態(tài)數(shù)據(jù)成員的拷貝只有一個,且對該類的所有對象可見。也就是說任一對象都可以對靜態(tài)數(shù)據(jù)成員進行操作。而對于非靜態(tài)數(shù)據(jù)成員,每個對象都有自己的一份拷貝。
由于上面的原因,靜態(tài)數(shù)據(jù)成員不屬于任何對象,在沒有類的實例時其作用域就可見,在沒有任何對象時,就可以進行操作
和普通數(shù)據(jù)成員一樣,靜態(tài)數(shù)據(jù)成員也遵從public, protected, private訪問規(guī)則
靜態(tài)數(shù)據(jù)成員的初始化格式:數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員名=值
類的靜態(tài)數(shù)據(jù)成員有兩種訪問方式:類對象名.靜態(tài)數(shù)據(jù)成員名 或 類類型名::靜態(tài)數(shù)據(jù)成員名
在C語言中,static關鍵字的作用如下:
1、在修飾變量的時,static修飾的靜態(tài)局部變量只執(zhí)行一次,而且延長了局部變量的生命周期,直到程序運行結束以后才釋放。
2、static修飾全局變量的時,這個全局變量只能在本文件中訪問,不能在其它文件中訪問,即便是extern外部聲明也不可以。
3、static修飾一個函數(shù),則這個函數(shù)的只能在本文件中調(diào)用,不能被其他文件調(diào)用。Static修飾的局部變量存放在全局數(shù)據(jù)區(qū)的靜態(tài)變量區(qū)。
擴展資料:
static關鍵字在C語言、C++、java中的作用有著相似之處,但也存在差異:
一、C++的static用法:
1、面向過程程序設計中的static和面向?qū)ο蟪绦蛟O計中的static。前者應用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用。
2、在類中,static可以用來修飾靜態(tài)數(shù)據(jù)成員和靜態(tài)成員方法
靜態(tài)數(shù)據(jù)成員
(1)靜態(tài)數(shù)據(jù)成員可以實現(xiàn)多個對象之間的數(shù)據(jù)共享,它是類的所有對象的共享成員,它在內(nèi)存中只占一份空間,如果改變它的值,則各對象中這個數(shù)據(jù)成員的值都被改變。
(2)靜態(tài)數(shù)據(jù)成員是在程序開始運行時被分配空間,到程序結束之后才釋放,只要類中指定了靜態(tài)數(shù)據(jù)成員,即使不定義對象,也會為靜態(tài)數(shù)據(jù)成員分配空間。
(3)靜態(tài)數(shù)據(jù)成員既可以通過對象名引用,也可以通過類名引用。
靜態(tài)成員函數(shù)
(1)靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,他們都屬于類的靜態(tài)成員,而不是對象成員。
(2)非靜態(tài)成員函數(shù)有this指針,而靜態(tài)成員函數(shù)沒有this指針。
(3)靜態(tài)成員函數(shù)主要用來方位靜態(tài)數(shù)據(jù)成員而不能訪問非靜態(tài)成員。
二、java的static用法:
1、聲明為static的變量稱為靜態(tài)變量或類變量。可以直接通過類名引用靜態(tài)變量,也可以通過實例名來引用靜態(tài)變量,但最好采用前者,因為后者容易混淆靜態(tài)變量和一般變量。
2、聲明為static的方法稱為靜態(tài)方法或類方法。靜態(tài)方法可以直接調(diào)用靜態(tài)方法,訪問靜態(tài)變量,但是不能直接訪問實例變量和實例方法。靜態(tài)方法中不能使用this關鍵字,因為靜態(tài)方法不屬于任何一個實例。
參考資料來源:百度百科-static(計算機高級語言)
本文名稱:c語言靜態(tài)函數(shù)定義 c語言靜態(tài)函數(shù)的聲明和定義
當前路徑:http://www.chinadenli.net/article18/doddigp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、靜態(tài)網(wǎng)站、企業(yè)建站、網(wǎng)站設計、、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)