2011-07-15 15 views
2

例えば私のCar.cppをすることができ、私のclass Carを実装している私は車というクラスを定義Car.hを持っている、と私は実装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++では、2つの全く異なるユニットに同じ名前のグローバル変数がある場合、コンパイラはサイレントにを参照して混乱を作ります。

+1

私は質問を誤解して掲載しましたが、これは正しいです。彼が投稿したコードはヘッダファイルだと思った!いずれにせよ、ベストプラクティスは.CPPファイルに対して 'ヘルパー'をローカルにするために 'static'を使うことです(これは意図していると思われます)。 – andrewdski

+1

@andrewdski、そうです。しかし、 'Helper'は' .cpp'ファイル内で宣言されているので、 'helper []'が 'static'かどうかにかかわらず、何の効果もありません。 – iammilind

+1

グローバルな名前空間を汚染します。後で彼がTruck.cppを書き、 'helper'配列も必要であるとします。 – andrewdski

2

ファイルスコープで定義されたオブジェクトはStatic Storage Durationオブジェクトと呼ばれます。

ほとんどの状況では、main()が終了してからmain()が終了した後にmain()が作成される前に作成されていると考えることができます(例外はありますが、

  • 静的記憶期間変数の破壊の順序は、作成の逆の順序です。

  • 同じコンパイル単位(ファイル)内での作成順序は、宣言された順序です。

    • 注:Static Storage Durationのオブジェクトを異なるコンパイル単位で作成する順序についての保証はありません。
関連する問題