static注意事項

2021-05-22 11:09:44 字數 3239 閱讀 5425

static關鍵字是c,   c++中都存在的關鍵字,   它主要有三種使用方式,   其中前兩種只指在c語言中使用,   第三種在c++中使用(c,c++中具體細微操作不盡相同,   本文以c++為準).  

(1)區域性靜態變數  

(2)外部靜態變數/函式  

(3)靜態資料成員/成員函式  

下面就這三種使用方式及注意事項分別說明  

一、區域性靜態變數  

在c/c++中,   區域性變數按照儲存形式可分為三種auto,   static,   register  

(譚浩強,   第174-175頁)  

與auto型別(普通)區域性變數相比,   static區域性變數有三點不同  

1.   儲存空間分配不同  

auto型別分配在棧上,   屬於動態儲存類別,   佔動態儲存區空間,   函式呼叫結束後自動釋放,   而static分配在靜態儲存區,   在程式整個執行期間都不釋放.   兩者之間的作用域相同,   但生存期不同.  

2.   static區域性變數在所處模組在初次執行時進行初始化工作,   且只操作一次  

3.   對於區域性靜態變數,   如果不賦初值,   編譯期會自動賦初值0或空字元,   而auto型別的初值是不確定的.   (對於c++中的class物件例外,   class的物件例項如果不初始化,   則會自動呼叫預設建構函式,   不管是否是static型別)  

特點:   static區域性變數的」記憶性」與生存期的」全域性性」  

所謂」記憶性」是指在兩次函式呼叫時,   在第二次呼叫進入時,   能保持第一次呼叫退出時的值.    

示例程式一  

#include  

using   namespace   std;  

void   staticlocalvar()  

假設現在有兩個執行緒a,b執行期間都需要呼叫iptostr()函式,   將32位的ip位址轉換成點分10進製的字串形式.   現a先獲得執行機會,   執行iptostr(),   傳入的引數是0x0b090a0a,   順序執行完應該返回的指標儲存區內容是:」10.10.9.11」,   現執行到⑥時,   失去執行權,   排程到b執行緒執行,   b執行緒傳入的引數是0xa8a8a8c0,   執行至⑦,   靜態儲存區的內容是192.168.168.168.   當再排程到a執行時,   從⑥繼續執行,   由於strbuff的全域性唯一性,   內容已經被b執行緒沖掉,   此時返回的將是192.168.168.168字串,   不再是10.10.9.11字串.  

二、外部靜態變數/函式  

在c中static有了第二種含義:用來表示不能被其它檔案訪問的全域性變數和函式。,   但為了限制全域性變數/函式的作用域,   函式或變數前加static使得函式成為靜態函式。但此處「static」的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案(所以又稱內部函式)。注意此時,   對於外部(全域性)變數,   不論是否有static限制,   它的儲存區域都是在靜態儲存區,   生存期都是全域性的.   此時的static只是起作用域限制作用,   限定作用域在本模組(檔案)內部.  

使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名。  

示例程式三:  

//file1.cpp  

static   int   vara;  

int   varb;  

extern   void   funa()  

static   void   funb()  

//file2.cpp  

extern   int   varb;   //   使用file1.cpp中定義的全域性變數  

extern   int   vara;   //   錯誤!   vara是static型別,   無法在其他檔案中使用  

extern   vod   funa();   //   使用file1.cpp中定義的函式  

extern   void   funb();   //   錯誤!   無法使用file1.cpp檔案中static函式  

三、靜態資料成員/成員函式(c++特有)  

c++重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於乙個類而不是屬於此類的任何特定物件的變數和函式.   這是與普通成員函式的最大區別,   也是其應用所在,   比如在對某乙個類的物件進行計數時,   計數生成多少個類的例項,   就可以用到靜態資料成員.   在這裡面,   static既不是限定作用域的,   也不是擴充套件生存期的作用,   而是指示變數/函式在此類中的唯一性.   這也是」屬於乙個類而不是屬於此類的任何特定物件的變數和函式」的含義.   因為它是對整個類來說是唯一的,   因此不可能屬於某乙個例項物件的.   (針對靜態資料成員而言,   成員函式不管是否是static,   在記憶體中只有乙個副本,   普通成員函式呼叫時,   需要傳入this指標,   static成員函式呼叫時,   沒有this指標.   )  

請看示例程式四((影印版)第59頁)  

class   enemytarget    

enemytarget(const   enemytarget&)    

~enemytarget()    

static   size_t   numberoftargets()    

bool   destroy();       //   returns   success   of   attempt   to   destroy   enemytarget   object  

private:  

static   size_t   numtargets;                               //   object   counter  

};  

//   class   statics   must   be   defined   outside   the   class;  

//   initialization   is   to   0   by   default  

size_t   enemytarget::numtargets;  

在這個例子中,   靜態資料成員numtargets就是用來計數產生的物件個數的.  

另外,   在設計類的多執行緒操作時,   由於posix庫下的執行緒函式pthread_create()要求是全域性的,   普通成員函式無法直接做為執行緒函式,   可以考慮用static成員函式做執行緒函式.

static關鍵字注意事項

1 靜態方法中是沒有this關鍵字的,因此無法在靜態方法中引用非靜態變數。非靜態方法中可以直接訪問成員變數是因為隱含呼叫了this 非靜態方法中的 system.out.println num 等價於system.out.println this.num 因為靜態變數是隨著類的載入而載入的,this...

static注意事項及其使用規範

myclass類 package com.zr public class myclass int num 成員變數 static int numstatic 靜態變數 成員方法 public void method 靜態方法 public static void methodstatic demo類...

java DOM 注意事項

1.w3c把標籤內的文字部分也定義成乙個node 2.element物件代表的是xml文件中的標籤元素 繼承於node,亦是node的最主要的子物件 3.attr實際上是包含在element中的,它並不能被看作是element的子物件,因而在dom中attr並不是dom樹的一部分,所以node中的 ...