2014-03-03 49 views
1

爲什麼在一個靜態變量已經被重新初始化爲文件中的一個全球性的? 否則,它會給出鏈接錯誤。它背後的理論是什麼?我知道靜態變量將位於數據段中。爲什麼類中的靜態變量給出鏈接錯誤?

my_class.h

class my_class 
    { 
    public: 
    static int m_fid; 
    void get_fid(); 
    }; 

my_class.cpp:

#include <iostream> 
using namespace std; 
int main() 
{ 
    my_class t; 
/**this gives a linking error */ 
my_class::m_fid = 0; 
return 0; 
} 
+0

什麼認爲其範圍應該是什麼? – Beta

+0

範圍在DS中。當我們實例化時,對象位於堆棧或堆中。堆棧成員不能是堆棧或堆的成員部分。因此,它永遠不會被實例化。但是,當我們實例化類時,C++不夠聰明,無法將它放入DS中。 –

回答

2

第一個靜態變量的所有定義是錯誤的。 而不是my_class::m_fid = 0;當你這樣做不會有更多的鏈接錯誤,你應該定義爲int my_class::m_fid = 0; ..

再就是按照標準...

The definition for a static data member shall appear in a namespace 
scope enclosing the member’s class definition. 
+0

這不是一個定義,它是一個函數內部的賦值。添加'int'將是無效的;限定名稱不能在本地範圍內聲明。 – Potatoswatter

+0

@SHREYAS JOSHI的意圖是那個;所以我們應該向他清楚你需要定義'static variable';只有靜態變量的聲明發生在類內...希望對此正確.. – HadeS

+0

您應該定義爲「int my_class :: m_fid = 0;」主呼叫之外。 – Subhajit

1

是的,static變量(無論他們在哪裏聲明)進入數據段。

static意味着不同的事情取決於使用它的,雖然。

  • 在文件或命名空間範圍,它表示該變量特定於.cpp文件(轉換單元)。
  • 在本地範圍,則意味着該變量是特定於該範圍內,其可以是特定於翻譯單元,或翻譯單元之間共享,如果它在一個inline功能。
  • 在類範圍內,所述類中的static成員聲明有效(幾乎)相同的一個與extern符類的外部是。

和聲明爲extern的變量一樣,靜態成員只有在達到定義時纔會被視爲聲明(而未定義)。

有一些static conststatic constexpr成員的異常,使他們可以在class內部進行初始化,然後立即使用,受該部件的地址從未使用的限制。

+0

但是,我已經實例化了具有靜態變量的類的對象。看起來,它從未初始化。你是說,類中的靜態成員只在該類中有一個範圍。它必須分開實例化。但爲什麼它必須分別實例化? –

+0

@SHREYASJOSHI你所說的「實例」意思?靜態成員不關心這個類是否曾經被用來生成一個對象。它們是全局變量,獨立於其他對象存在。 – Potatoswatter

+0

那麼,我們爲什麼要把他們綁在課堂上呢? –

相關問題