簡體   English   中英

C ++中的靜態變量

[英]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.

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