標籤:color under bin 記憶體地區 編碼 存取權限 不同 static 許可權
C++中關鍵字的理解---Static
目錄:1、static緣起
2、static自我理解
3、static舉例使用
4、總結
--------------------------------------------------------------------------------------------------
1、static緣起
C語言是面向過程構架,多檔案為單位的編碼的優異之處在於保持不同源檔案和函數之間的相互引用(即聯絡)和相互獨立,因而產生了extern和static關鍵字。而面向過程的C和物件導向的C++有千絲萬縷的聯絡,暫且不說用C可以完全構架和類比衍化出C++,第二部分用我自己的理解會用一句話來描述:關鍵字static同C++的牽連。除此之外,需要知道:既然關鍵字Static修飾的是變數/函數,那麼這些資料都放在哪?
---進程在記憶體中的布局:
中的文本段保持的是程式的位元據;.data段儲存進程所有已初始化的全域變數;.bss(Block Started by Symbol)段儲存程式中未被初始化的全域變數的一塊記憶體地區,該段屬於靜態記憶體配置。進程的生命週期中,.data段和.bss段內資料同整個進程步伐一致。
2、static自我理解
static類似於C++中私人保護,專屬性由於深海魚和水的關係,離開深海既死(程式出錯)。
C++private私人保護(只在類內活動,可通過成員函數調用,類外使用不行);
static靜態全域變數(只在定義它的源檔案--c/cpp,中有效,其他源檔案無法訪問);
有人形象的形容普通全域變數穿上static外衣後,它就變成了新娘,已心有所屬,只能被定義它的源檔案(新郎)中的變數或函數訪問。
3、static舉例使用
1>全域靜態變數
file1.h:聲明子代碼
#include<stdio.h>void printStr();void printS();
file1.h
file1.cpp定義一個靜態全域變數hello,僅可以在file1.cpp下的函數printStr和printS訪問
#include"file1.h"static char* hello = "hello cobing!";void printStr(){ printf("%s\n", hello);}void printS(){ printf("%s\n", hello); printf("%s\n", hello);}file1.cpp
file2.cpp引用file1.h聲明下和調用file1.cpp下的定義函數,來對比是否能在不同源檔案下來對靜態全域變數訪問
#include"file1.h"void printfileStr(){ printf("%s\n", hello);}file2.cpp
結果證明是不行的。
main.cpp主檔案中的main函數通過調用file1下的函數可以訪問靜態全域變數,這和C++中private無異
#include"file1.h"int main(){ printStr(); printS(); return 0;}View Code
上面幾個函數證明了靜態全域變數的私人保護性比較??!
2>局部靜態變數
局部靜態變數 VS 普通局部變數
1】 位置: 靜態局部變數被編譯器放在全域儲存區.data,所以它雖然是局部的,但是在程式的整個生命週期中存在。
2】 存取權限:靜態局部變數只能被其範圍內的變數或函數訪問。也就是說雖然它會在程式的整個生命週期中存在,由於它是static的,它不能被其他的函數和源檔案訪問。
3】 值:靜態局部變數如果沒有被使用者初始化,則會被編譯器自動賦值為0,以後每次調用靜態局部變數的時候都用上次調用後的值。這個比較好理解,每次函數調用靜態局部變數的時候都修改它然後離開,下次讀的時候從全域儲存區讀出的靜態局部變數就是上次修改後的值。
-------一句話,靜態局部變數的私人保護強度進一步(╯▔皿▔)╯升級,在靜態全域基礎上限制為:只能在同源檔案下的同函數內。
eg:
file1.h用上面的即可。
/*static 局部*/void printStr(){ int normal = 0; static int stat = 0;//靜態局部變數 printf("normal = %d ---- stat = %d\n", normal, stat); normal++; stat++;}file1.cpp
上面直接應用是有錯的,證明的是私人性更強了。
上面結果證明:靜態局部變數的時候都用上次調用後的值(好像記憶斷電,每次在原來基礎上作用)。但普通的局部變數一直是初始化的狀態為0;
3>靜態函數
參考連結:http://blog.csdn.net/keyeagle/article/details/6708077/ 作者寫的已經非常(??????)??棒了!
4、總結
一句話,Static生在C 類似C++中private;
C++中關鍵字的理解--Static