解析static在C和C++中的用法以及區別_C 語言

來源:互聯網
上載者:User

static主要有三個作用:
(1)局部靜態變數
(2)外部靜態變數/函數
(3)待用資料成員/成員函數
前兩種C和C++都有,第三種僅在C++中有,下面分別作以下介紹:

一、局部靜態變數
在C/C++中, 局部變數按照儲存形式可分為三種auto, static, register。其中register不常用到,下面主要說說auto和static的區別。

1. 儲存空間分配和生存周期不同
auto類型局部變數就是普通的局部變數(不加修飾的局部變數預設為該類型)。該類型局部變數儲存在棧上,在動態儲存裝置區,生命週期僅限於定義它的函數,函數結束,它就自動釋放。static類型局部變數儲存在靜態儲存區,在程式整個運行期間都不釋放。兩者之間的範圍相同,但生存期不同。

2. static局部變數在所處模組在初次運行時進行初始化工作,且只操作一次。

3. 對於局部靜態變數,如果不賦初值,編譯期會自動賦初值0或Null 字元,而auto類型的初值是不確定的。(對於C++中的class對象例外,class的對象執行個體如果不初始化,則會自動調用預設建構函式,不管是否是static類型)

特點: static局部變數的”記憶性”與生存期的”全域性”

二、外部靜態變數/函數
在C中 static有了第二種含義:用來表示不能被其它檔案訪問的全域變數和函數。但為了限制全域變數/函數的範圍, 函數或變數前加static使得函數成為靜態函數。但此處“static”的含義不是指儲存方式,而是指對函數的範圍僅局限於本檔案(所以又稱內部函 數)。注意此時, 對於外部(全域)變數, 不論是否有static限制, 它的儲存地區都是在靜態儲存區,生存期都是全域的. 此時的static只是起範圍限制作用, 限定範圍在本模組(檔案)內部.使用內建函式的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它檔案中的函數同名。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.