簡體   English   中英

關於C ++中的局部和全局靜態變量

[英]On local and global static variables in C++

C ++ Primer說

在第一次執行通過對象的定義之前,會初始化每個本地靜態變量。 當函數結束時,不會破壞局部靜態; 它們在程序終止時被銷毀。

局部靜態變量與全局靜態變量有什么不同? 除了聲明它們的位置之外,還有什么不同?

void foo () {   
    static int x = 0;
    ++x;

    cout << x << endl;
}

int main (int argc, char const *argv[]) {
    foo();  // 1
    foo();  // 2
    foo();  // 3
    return 0;
}

與之比較

static int x = 0;

void foo () {   
    ++x;

    cout << x << endl;
}

int main (int argc, char const *argv[]) {
    foo();  // 1
    foo();  // 2
    foo();  // 3
    return 0;
}

不同之處是:

  • 該名稱只能在函數中訪問,並且沒有鏈接。
  • 它在第一次執行到達定義時初始化,不一定在程序的初始化階段。

第二個差異可以用於避免靜態初始化順序慘敗 ,其中全局變量可以在初始化之前被訪問。 通過用返回對本地靜態變量的引用的函數替換全局變量,可以保證在訪問它之前初始化它。 (但是,仍然無法保證在完成任何操作之前它不會被銷毀;如果您認為需要一個全局可訪問的變量,您仍需要非常小心。請參閱注釋以獲取有關該情況的幫助鏈接 。 )

它們的范圍不同。 全局范圍的靜態變量可供文件中的任何函數訪問,而函數范圍的變量只能在該函數中訪問。

希望這個例子有助於理解靜態局部變量和全局變量之間的區別。

#include <iostream>

using namespace std;

static int z = 0;

void method1() {
    static int x = 0;
    cout << "X : " << ++x << ", Z : " << ++z << endl;
}

void method2() {
    int y = 0;
    cout << "Y : " << ++y << ", Z : " << ++z << endl;
}

int main() {
    method1();
    method1();
    method1();
    method1();
    method2();
    method2();
    method2();
    method2();
    return 0;
}

輸出:

X : 1, Z : 1
X : 2, Z : 2
X : 3, Z : 3
X : 4, Z : 4
Y : 1, Z : 5
Y : 1, Z : 6
Y : 1, Z : 7
Y : 1, Z : 8

有真名是:

static storage duration object.

全局變量也是“靜態存儲持續時間對象”。 與全局變量的主要區別在於:

  • 它們在第一次使用之前不會初始化
    注意:構造期間的異常意味着它們未初始化,因此未使用。
    所以它會在下次輸入函數時重新嘗試。
  • 它們的可見性受其范圍的限制
    (即在功能之外無法看到它們)

除此之外,它們就像其他“靜態存儲持續時間對象”一樣。

注意:與所有“靜態存儲持續時間對象”一樣,它們會以創建的相反順序銷毀。

主要或最嚴重的區別是初始化時間。 本地靜態變量在第一次調用函數時初始化,在函數聲明它們。 在調用main函數之前的某個時間點初始化全局函數,如果你有很少的全局靜態變量,它們會以未指定的順序初始化,這可能會導致問題; 這稱為靜態初始化慘敗。

在你的第一個代碼塊中,x是foo()函數的本地,這意味着它在foo()中創建並在cout之后的函數末尾被銷毀。 但是,在第二個塊中,x是全局的,這意味着x的范圍是整個程序。 如果你想在int main下你可以cout << x << endl然而它會打印,但是在第一個塊中它會說x沒有聲明

  1. 它們對程序中的所有函數都是已知的,而全局變量僅在有限的范圍內是已知的。
  2. 全局靜態變量可以在程序啟動之前初始化,而本地靜態變量可以在執行到達點時初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM