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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM