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