2012-03-01 12 views
0

静的なメンバーが私のヘッダーを乱雑にするのは興味がありません。なぜなら、それはcpp本体のフリー機能によってのみ使用されるからです。ここで静的変数を宣言すると、静的メンバーの場合と同じように1つのアドレスしか占有しませんか?静的な非メンバ変数は、プログラム内のすべてのスレッドと同じ変数ですか?

謝罪しますが、C++での静的な使用は私にはかなり不明です。

私はの線に沿って考えています:

static Osp::Base::Runtime::Monitor sharedMonitor; 
+0

私はhttp://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program/572550#572550が良いスタートポイントだと思っています –

+0

@NicolasMartin:静的メンバーはここで良い? – John

答えて

0

まず、「静的」という言葉は、C++で2つの意味があります。それが今度はどこに応じて異なる効果を持っている キーワードstatic(参照することができます )を使用するか、変数の有効期間を参照することができます。すべて 変数は静的な有効期間を持ちます。

あなたは、静的 ライフタイムの変数を探していると思いますが、これは単一の翻訳単位 の外には表示されません。 staticを宣言されている

namespace { 
int myWhatever;  // No keyword static... 
} 

クラスのメンバ変数(関数内)のローカル変数がそうであるようにも、静的 寿命を持っている を宣言します。これを行うための好ましい方法は、無名の名前空間に 変数を定義することですstatic

このような変数は、 翻訳単位で定義された後はどこでもアクセスできますが、他の場所ではアクセスできません。単一のインスタンスがあり、 がプログラムの開始時に入り、 のプログラムが実行されている限り続きます。コンストラクタがある場合、コンストラクタはmainの前に呼び出される (ダイナミックオブジェクトがロードされている場合はダイナミック リンクが使用されています)、exitがコールされた後にデストラクタが呼び出されます(またはダイナミックオブジェクトがダイナミックリンクの場合はアンロードされます。 が使用されます)。スレッドに関して

、C++ 11は、ストレージクラス指定 thread_localを有する:この指定子で宣言された変数は スレッドと等価である寿命で、スレッドごとに1つのインスタンス を有します。最初に使用する前に初期化(構築)され、スレッドが終了すると が破壊されます。これは、 静的とは異なるものです。

1

はい。名前空間スコープで静的変数を定義すると、その変数のインスタンスが1つあり、定義されている翻訳単位内でアクセスできます。

+0

私は静的なメンバーの方法を試みたが、ランダムなクラッシュを取得し続ける。私が見たすべての例では、クラス宣言の外で何らかの定義が必要ですが、私はこのクラスでどのようにできるのか分かりません。 – John

関連する問題