1. 程式人生 > >從c到cpp對static 關鍵字的總結 需要整理下!!!!!!!!!!!!!!!!!!!!!!

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

之間 所在 結束 初始 程序 全局函數 代碼區 16px 類對象

一個完整的程序,在內存中的分布情況如下:  具體分布圖 自己看書去!!!!!
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 關鍵字的總結 需要整理下!!!!!!!!!!!!!!!!!!!!!!