從c到cpp對static 關鍵字的總結 需要整理下!!!!!!!!!!!!!!!!!!!!!!

來源:互聯網
上載者:User

標籤:地區   之間   不顯示   相同   隱式   自己   代碼   靜態變數   nbsp   

一個完整的程式,在記憶體中的分布情況如下:  具體分布圖     自己看書去!!!!!
1.棧區: 由編譯器自動分配釋放,像局部變數,函數參數,都是在棧區。會隨著作用於退出而釋放空間。
3.堆區:程式員分配並釋放的地區,像malloc(c),new(c++) 
3.全域資料區(靜態區):全域變數和靜態便令的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區,未初始化的全域變數和未初始化的靜態變數在相鄰的另一塊地區。程式結束釋放。
4.代碼區

 

C 語言的 static 關鍵字有三種(具體來說是兩種)用途:

1. 靜態局部變數:用於函數體內部修飾變數,這種變數的生存期長於該函數。

2. 靜態全域變數:定義在函數體外,用於修飾全域變數,表示該變數只在本檔案可見。

3. 靜態函數:靜態函數跟靜態全域變數的作用類似:
                      一. 靜態函數不能被其它檔案所用;
                      二. 其它檔案中可以定義相同名字的函數,不會發生衝突;

==========================================================================

:在C語言中,static主要定義全域靜態變數,定義局部靜態變數,定義靜態函數

 一、       定義全域靜態變數 :在全域變數前面加上關鍵字static,該全域變數變成了全域靜態變數。全域靜態變數有以下特點:

(1)       在全域資料區內分配記憶體

(2)       如果沒有初始化,其預設值為0

(3)       該變數在本檔案內從定義開始到檔案結束可見

 二、       定義局部靜態變數:在局部靜態變數前面加上關鍵字static,該局部變數便成了靜態局部變數。靜態局部變數有以下特點:

(1)       該變數在全域資料區分配記憶體

(2)       如果不顯示初始化,那麼將被隱式初始化為0

(3)       它始終駐留在全域資料區,直到程式運行結束

(4)       其範圍為局部範圍,當定義它的函數或語句塊結束時,其範圍隨之結束。

  三、       定義靜態函數:在函數的傳回型別加上static關鍵字,函數即被定義成靜態函數。靜態函數有以下特點:

(1)       靜態函數只能在本源檔案中使用

(2)       在檔案範圍中聲明的inline函數預設為static

                說明:靜態函數只是一個普通的全域函數,只不過受static限制,他只能在檔案所在的編譯模組內使用,不能夠在其他編譯模組內使用。

 

 

 

C++對static的擴充
1)在類中的static修飾的成員變數屬於類可以共用,相當於全域變數,不屬於具體的某個執行個體或者對象,也就是說當某個類的執行個體修改了該靜態成員變數,其修改值為該類的其它所有執行個體所見,還有必須在類外初始化,static成員變數訪問形式:1°可以被對象訪問 2° 可以被類訪問 3°可以被對象指標訪問
2)普通函數有this指標,指標可訪問所有成員,但在類中的static成員函數屬於整個類所擁有,這個函數不接收this指標,所以只能訪問類的static成員變數。static只能在聲明函數時加,不能再定義時候加(類中聲明,類外初始化)

 

在C++語言中新增了兩種作用:定義待用資料成員或靜態函數成員

(1)       定義待用資料成員。待用資料成員有如下特點:

(1)       記憶體配置:在程式的全域資料區分配

(2)       初始化和定義:待用資料成員定義時要分配空間,所以不能在類聲明中定義

(3)       靜態成員函數。靜態成員函數與類相聯絡,不與類的對象相聯絡。靜態成員函數不能訪問非待用資料成員。原因很簡單,非待用資料成員屬於特定的類執行個體,主要用於對待用資料成員的操作。

(4)       靜態成員函數和待用資料成員都沒有this指標。

 

1.靜態成員之間可以相互訪問,包括靜態成員函數訪問待用資料成員和訪問靜態成員函數;
2.非靜態成員函數可以任意地訪問靜態成員函數和待用資料成員;
3.靜態成員函數不能訪問非靜態成員函數和非待用資料成員;
4.調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指標調用靜態成員函數,也可以用類名::函數名調用(因為他本來就是屬於類的,用類名調用很正常)
---------------------

 1 static修飾的變數先於對象存在,所以static修飾的變數要在類外初始化。因為static是所有對象共用的東西嘛,必須要比對象先存在的。

 2 用static修飾的成員變數在對象中是不佔記憶體的,因為他不是跟對象一起在堆或者棧中產生,用static修飾的變數在靜態儲存區產生的,所以用static修飾一方面的好處是可以節省對象的記憶體空間。

3  由於static修飾的類成員屬於類,不屬於對象,因此static類成員函數是沒有this指標的,this指標是指向本對象的指標。正因為沒有this指標,所以static類成員函數 不能訪問非static的類成員,只能訪問 static修飾的類成員。

 

從c到cpp對static 關鍵字的總結 需要整理下!!!!!!!!!!!!!!!!!!!!!!

相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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