1. 程式人生 > 實用技巧 >c++靜態變數(static)

c++靜態變數(static)

寫在前面:

1.C++中的全域性變數具有全域性作用域。全域性變數只需在一個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包含全域性變數定義的原始檔需要用extern 關鍵字再次宣告這個全域性變數。

2.C++中,在函式或一個程式碼塊內部宣告的變數,稱為區域性變數。它們只能被函式內部或者程式碼塊內部的語句使用。當局部變數被定義時,系統不會對其初始化,必須自行對其初始化。

在程式中,區域性變數和全域性變數的名稱可以相同。但是在函式內的區域性變數與全域性變數是兩個獨立的變數,互不影響,全域性變數的值可以在區域性函式內重新賦值。

注:全域性變數從定義處開始至程式結束起作用,即全域性變數存在有效作用域。

#include<iostream>
using namespace std;

int main()
{
     cout<<"a= "<<a<<endl; //編譯不通過,a是未知字元
     return 0;
}
int a=10; //全域性變數從此處定義

若要想讓 main 函式也使用全域性變數 a,可以用 extern 對全域性變數進行宣告,就可以合法使用了。

#include<iostream>
using namespace std;

int main()
{
     extern int a;
     cout
<<"a= "<<a<<endl; //合法,輸出10 return 0; } int a=10; //全域性變數從此處定義

靜態變數

儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存在靜態儲存區:全域性變數和 static 變數。

1.靜態區域性變數:作為 static 區域性變數在函式內定義,它的生存期為整個源程式,但是其作用域仍與區域性變數相同,只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還繼續存在,但不能使用它!

#include <iostream>
using namespace std;

int count = 1; //全域性變數
int fun()
{
    static int count = 10; // 在第一次進入這個函式的時候,變數 count 被初始化為 10  
    return count--; //以後每次進入該函式就不會被再次初始化了,count 的值是上一次函式執行之後的值
(如果不用static的話,每次呼叫區域性變數count都是10,也就是每次都會先初始化) } int main() { for(;count <= 10; ++count) cout<<"全域性變數:"<<count<<" 靜態區域性變數:"<<fun()<<endl; return 0; } 輸出: 全域性變數:1 靜態區域性變數:10 全域性變數:2 靜態區域性變數:9 全域性變數:3 靜態區域性變數:8 全域性變數:4 靜態區域性變數:7 全域性變數:5 靜態區域性變數:6 全域性變數:6 靜態區域性變數:5 全域性變數:7 靜態區域性變數:4 全域性變數:8 靜態區域性變數:3 全域性變數:9 靜態區域性變數:2 全域性變數:10 靜態區域性變數:1

由此可見全域性變數和區域性靜態變數 count 的作用域是不同的。靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。

2.靜態全域性變數:也具有全域性作用域,它與全域性變數的區別在於如果程式包含多個檔案的話,它作用於定義它的檔案裡,不能作用到其它檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同名字的靜態全域性變數,它們也是不同的變數。

從分配記憶體空間看:全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間。

總結:

static 全域性變數:改變作用範圍,不改變儲存位置

static 區域性變數:改變儲存位置,不改變作用範圍

寫在後面:

靜態函式:在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。

如果在一個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式也稱為內部函式。定義一個內部函式,只需在函式型別前再加一個“static”關鍵字即可。

參考:https://www.runoob.com/cplusplus/cpp-variable-scope.html