2013-10-27 41 views
1

我不知道,當我聲明的變量使用什麼內存空間和一個函數或方法,例如外初始化值之外聲明的變量是什麼內存,用於方法或函數

// CBar.h> 
class CBar 
{ 
public: 
    CBar(); 
    ~CBar(); 
}; 

// CBar.cpp 
std::string const NAME = "mr.foo"; 

CBar::CBar() 
{ 
    std::cout << NAME << std::endl; 
} 

CBar::~CBar() 
{ 
} 

我在方法之外聲明的NAME變量。是否有任何問題聲明和初始化這個NAME變量?每次我創建CBar實例時,NAME變量仍然存在?

謝謝。

回答

4

在你的代碼中,NAME是一個靜態變量(就像文件CBar.cpp中的全局變量)。它在程序的一開始就實例化一次,並在整個程序中生存(內存保持分配)。

無論您實例化或刪除CBar對象多少次,該值/內存將始終可訪問(從CBar.cpp中),因爲該變量獨立於CBar類。

更具體地說,靜態內存位於已初始化的數據段中。請參閱此答案以獲得有關內存區域的良好說明:Global memory management in C++ in stack or heap?

+0

沒有「靜態鏈接」這樣的東西。 (靜態變量不可鏈接。) –

+0

@DwayneTowell好點。謝謝,我不小心。編輯糾正... – Turix

+0

@DwayneTowell:這一點是正確的,但解釋不是。一個名稱在C++中具有「鏈接」,可能表示在另一個作用域中聲明的同一個實體。因此,雖然沒有「靜態鏈接」,但當使用該名稱在同一翻譯單元中的其他範圍內引用實體時,可以使用「內部鏈接」。完全沒有鏈接的名稱意味着該實體不能被任何其他作用域的名稱引用,包括同一翻譯單元內的作用域。有關更多信息,請參閱C++ 11 3.5.2。 –

2

NAME變量是全局變量。它在main()之前存在,直到它返回。如果以下聲明包含在另一個源文件中,它可以從另一個模塊鏈接。

extern std::string const NAME; 

如果你不希望這被允許,你應該聲明它如下所示。

static std::string const NAME; 

現在它只是「污染」了CBar.cpp中的標識符名稱空間。如果你想避免這種情況,你需要使它成爲CBar的私有/受保護的成員變量。

+0

默認情況下,它實際上會獲得內部鏈接,因爲它被聲明爲「const」。你必須明確地添加'extern'來給它外部鏈接。 –

相關問題