2012-02-08 2 views
-2

静的変数はクラス以外のC++のどこにでも存在できますか?もしそうなら、彼らはどのような行動をしますか?オブジェクトがないのでインスタンス間で共有されていないと仮定します。C++では静的変数をクラスから解放することはできますか?

+0

あなたはdownvote場合は、理由を言う - そして、私は質問を向上させることができます。それは一種のポイントです。 – SirYakalot

答えて

3

はい。

静的オブジェクトの有効期間はプログラムの有効期間であり、変数がファイルスコープで宣言されている場合はオブジェクト内部のリンケージとなります(ブロックスコープで定義されている場合はリンケージはありません)。

1

関数の外では、staticはそのコンパイル単位のローカルを意味します。匿名の名前空間でも同じ効果を得ることができます。

1

確かには、当然のことながら、例えば:だから

int sequence() 
{ 
    static int result = 0; 
    return ++result; 
} 

、ここでは、結果変数は、関数のスコープ外に存在し、常にあなたが関数を入力するたびに増加していきます。

1

二つの他の場所:

  1. グローバル変数と

    • グローバルstatic変数(または関数)関数は、そのコンパイル単位に対してローカルであり、他のコンパイル単位
    • から「見た」ことはできません
  2. ローカル変数

    • staticローカル変数は宣言が初めて渡されたときに一度だけ初期化されます(これは関数が呼び出されたときにのみ実行するのに便利です)。その後、関数が返された後でも値は保持されますそしてstaticのこれらの異なる用途が本当にお互いに何の関係もないことを改めて

ノートと呼ばれます。 staticは、使用する場所によって異なるものを意味します(constのように)。

0

静的変数の意味によって異なります。 staticキーワードは、使用している状況によって異なるセマンティクスを持ちます。

メンバー変数は、静的として宣言された場合、静的な記憶期間を持ちます。これは、これらの変数の存続期間がプログラムの期間続くことを意味します。これは「静的変数」の共通の意味です。変数は静的記憶域期間を持つことになり、その下3例がある:staticキーワードがローカル(関数スコープ)変数で使用され

  1. staticキーワードがクラスメンバー変数に適用されている場合。
  2. 動的またはスレッド記憶期間を持たず、ローカル変数ではない変数。

例:

struct foo 
{ 
    static int x; // This has static storage duration 
}; 

void bar() 
{ 
    static int y = 5; // This has static storage duration 
} 

int z = 1; // This has static storage duration 

それがあったかのように、あなたの質問に答えるためには、「?ときに、クラスのないメンバー変数は静的記憶域期間を持つことができます」、答えはイエスです。グローバルまたは名前空間のスコープ変数は、デフォルトでは静的な記憶期間を持ちます。 staticとして宣言された関数スコープ変数には、静的な記憶期間もあります。

しかし、staticキーワードは、グローバルまたは名前空間のスコープ内の変数で使用される場合、別の意味を持ちます。これらの場合、staticは変数に内部リンケージがあることを指定します。つまり、同じ翻訳単位内でのみ参照することができます。

例:

static int i = 5; // This has internal linkage 
関連する問題