最近在看
c++
,總是不斷的遇到關鍵字static,對此關鍵字不是很了解,每次遇到都有些困惑,不知道此處為啥要用static,今日通過網上一些資料,仔細認真的了解了
static
的用法。
static的在好多程式語言中存在,那他在
c++中出現的原因是什麼呢?換句話說就是在
c++中什麼時候需要使用到
static
。函式內部定義的變數,在程式執行到他的定義處時,編譯器在棧上為他分配空間。函式在棧上分配的空間在此函式執行結束時會釋放掉,因此就出現了這樣乙個問題:如何將函式中此變數的值儲存到下一次呼叫?一般我們會想到的方法是使用全域性變數,定義全域性變數有很多不好的缺點,最明顯的是破壞了此變數的訪問範圍(該變數不僅僅受此函式的控制,其他的函式也可以呼叫他),同時定義全域性變數會使得程式的可讀性變差,而且容易出錯,因此能不定義全域性變數就盡量不要定義全域性變數。
首先我們來說說
static的特殊之處。對於乙個完整的程式,其在記憶體中的分布情況如下圖:
**區(低位址)
全域性資料區 堆區
棧區(高位址)
一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數會隨著函式的退出釋放空間。而加了關鍵字
static的靜態資料存放在全域性資料區,全域性資料區的資料不會因為函式的退出而釋放空間。
static在
c++中根據他是在類中使用還是不在類中使用來兩種使用情況,首先我們來說說在非類中的情況,即面向過程的
static。
面向過程的
static
1.
靜態全域性變數
在全域性變數之前家上關鍵字
static,該變數就被定義為靜態全域性變數。靜態全域性變數在宣告他的整個檔案中是可見,在檔案之外是不可見。因此在其他檔案中可以定義相
同名字的變數而不會引起衝突。即使在其他檔案中使用extern宣告也不能起作用。
example1.cpp
#include #include "example2.h"
using namespace std;
static int n; //定義靜態全域性變數
void fun();
int main()
void fun()
void fun() //定義靜態函式
;int myclass::sum = 0; //定義並初始化靜態資料成員
myclass::myclass(int x,int y,int z)
void myclass::getsum()
;int myclass::sum = 0; //定義並初始化靜態資料成員
myclass::myclass(int x,int y,int z)
void myclass::getsum() //靜態成員函式的實現
{ //cout<
根據使用
static關鍵字的成員都是儲存在全域性資料區這個特性,可以總結
static關鍵字有如下幾種使用情況:
首先是隱藏,使用關鍵字
static是在乙個檔案中定義的內容不被其他檔案呼叫,同時可以防止在其他檔案中定義了相同名字的成員而引起衝突。(一般在定義全域性變數時會考慮這點,把全域性變數定義成靜態的)
當要保持函式中區域性變數的值的永續性,可以將區域性變數定義為靜態區域性變數。
當某個類的物件擁有相同的屬性時,可以將該屬性定義為靜態的,這樣該屬性只定義一次,不需要為每個物件都拷貝乙份,節省了空間。在物件導向的程式設計中巧妙的運用關鍵字
static可以起到優化程式的效果.
這些是我通過網上資料總結的內容,主要是加深自己對
static的理解,如果有不正確的地方,請大家斧正,不全面的請大家幫忙補充。如果能幫助你理解
static關鍵字,我表示很榮幸
。
通過了解原理才能更深刻的理解和運用。
c c 中static和extern使用
在c c 中static和extern都能夠用來修飾函式和變數,可是是有差別的。內部函式和內部變數 僅僅能在檔案內使用的函式和變數。外部函式和外部變數 可以被其他檔案使用的函式和變數。static 1 對函式 定義乙個內部函式 static void test 宣告乙個內部函式 static voi...
C C 中static的用法
c c 的static有兩種用法 面向過程程式設計中的static和物件導向程式設計中的static。前者應用於普通變數和函式,不涉及類 後者主要說明static在類中的作用。一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域...
說說C C 中的static
c語言中的靜態 1 區域性 a.靜態區域性變數在函式內定義,生存期為整個源程式,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後,儘管該變數還繼續存在,但不能使用它。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。2 全...