2011-07-15 26 views
2

假設我有有一個Car.h它定義了一個名爲Car類,我有實現Car.cpp它實現我class Car,例如我的Car.cpp可以是:C++數據結構對象的生命期是多少?

struct Helper { ... }; 
Helper helpers[] = { /* init code */ }; 
Car::Car() {} 
char *Car::GetName() { .....} 

什麼幫手陣列的續航時間? 我需要說static Helper helpers[];? 如果我做了一些不好的做法,請讓我知道。

回答

3

在全局/命名空間範圍中聲明/定義的任何變量都有一個完整的生命週期,直到代碼結束。

如果你希望你的Helper helpers[];只內Car.cpp可以訪問那麼只有你被宣佈爲static;否則讓它成爲一個全球性的。換句話說,

Helper helpers[];  // accessible everywhere if `extern`ed to the file 
static Helper helpers[]; // accessible only in `Car.cpp` 

編輯:作爲,@andrewdski建議在下面的評論;您應該使helpers[]static變量,因爲您在此文件中使用它;即使Helper在外面不可見。在C++中,如果兩個完全不同的單元具有相同的命名全局變量,那麼靜態編譯器通過將它們引用到相同的內存位置來創建一個混亂。

+1

我發佈了一個答案,誤解了這個問題,但這是正確的。我認爲他發佈的代碼是頭文件!在任何情況下,我都會說最好的做法是使用'static'將'helpers'設置爲.CPP文件的本地文件(假設看起來很可能就是這個意圖)。 – andrewdski

+1

@andrewdski,是的,你是對的。然而,由於'Helper'是在'.cpp'文件中聲明的,所以'helper []'是否被設置爲'static'並不會產生任何影響。 – iammilind

+1

它會污染全局名稱空間。假設他後來寫了一個Truck.cpp,它也需要一個'helper'數組。 – andrewdski

2

定義在文件範圍內的對象稱爲Static Storage Duration對象。

在大多數情況下,您可以將它們想象爲在main()進入並在main()退出後銷燬之前創建的(有例外但我不擔心)。

  • 靜態存儲持續時間變量的破壞順序與創建的相反順序有關。

  • 在同一個編譯單元(文件)中創建的順序是它們聲明的順序。

    • 注意:無法保證在不同編譯單元中創建Static Storage Duration對象的順序。