[英]Static variables in C++
我想知道頭文件中的靜態變量與類中聲明的靜態變量之間的區別。 在頭文件中聲明靜態變量時,其范圍僅限於.h文件或所有單元。 一般來說靜態變量在類中聲明時在.cpp文件中初始化了嗎? 那么這是否意味着靜態變量范圍僅限於2個編譯單元?
對不起,當我無序回答你的問題時,這樣就更容易理解了。
在頭文件中聲明靜態變量時,其范圍僅限於.h文件或所有單元。
沒有“頭文件范圍”這樣的東西。 頭文件包含在源文件中。 翻譯單元是源文件, 包括頭文件中的文本。 無論你在頭文件中寫什么,都會被復制到每個包含源文件中。
因此,在頭文件中聲明的靜態變量就像每個單獨源文件中的靜態變量。
由於這種方式聲明變量static
意味着內部鏈接,每個翻譯單元#include
你的頭文件都有自己的 單個變量(在你的翻譯單元之外是不可見的)。 這通常不是你想要的。
我想知道頭文件中的靜態變量與類中聲明的靜態變量之間的區別。
在類聲明中, static
表示該類的所有實例共享此成員變量; 也就是說,您可能有數百個此類型的對象,但只要其中一個對象引用static
(或“類”)變量,它就是所有對象的相同值。 您可以將其視為“全球級”。
一般來說靜態變量在類中聲明時在.cpp文件中初始化了嗎?
是的, 一個 (也是唯一一個 )翻譯單元必須初始化類變量。
那么這是否意味着靜態變量范圍僅限於2個編譯單元?
就像我說的:
static
意味着根據上下文完全不同的東西。 全局static
限制了翻譯單元的范圍。 類static
意味着全局到所有實例。
我希望這有幫助。
PS:檢查Chubsdad的答案的最后一段,關於如何在C ++中使用static
來指示內部鏈接,但是匿名命名空間。 (因為他是對的。;-))
頭文件中的靜態變量:
說'common.h'
有
static int zzz;
此變量'zzz'
具有內部鏈接(在其他翻譯單元中無法訪問此相同變量)。 每個包含'common.h'
翻譯單元都有自己獨特的名稱'zzz'
對象。
類中的靜態變量:
類中的靜態變量不是類的子對象的一部分。 該類的所有對象共享的靜態數據成員只有一個副本。
$ 9.4.2 / 6 - “命名空間范圍內的類的靜態數據成員具有外部鏈接(3.5)。本地類不應具有靜態數據成員。”
那么讓我們說'myclass.h'
有
struct myclass{
static int zzz; // this is only a declaration
};
和myclass.cpp
有
#include "myclass.h"
int myclass::zzz = 0 // this is a definition,
// should be done once and only once
和"hisclass.cpp"
有
#include "myclass.h"
void f(){myclass::zzz = 2;} // myclass::zzz is always the same in any
// translation unit
和"ourclass.cpp"
有
#include "myclass.h"
void g(){myclass::zzz = 2;} // myclass::zzz is always the same in any
// translation unit
因此,類靜態成員不僅限於2個翻譯單元。 它們只需在任何一個翻譯單元中定義一次。
注意:不推薦使用'static'來聲明文件范圍變量,並且未命名的命名空間是一種優越的替代方法
在類外部的頭文件中聲明的靜態變量將在包含頭的每個.c文件中進行file-scoped
。 這意味着在包含頭文件的每個.c文件中都可以訪問具有相同名稱的變量的單獨副本。
另一方面,靜態類變量是class-scoped
並且每個編譯單元都可以使用相同的靜態變量,其中包含包含具有靜態變量的類的標頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.