6
bool SomeClass::Function( bool thankYou = true )
{

    static bool justAbool = false;
    // Do something with justAbool;
    ...
}

私は周りを検索しましたが、グローバル変数またはメンバー関数自体を除いて、これについて何も見つかりません。

上記は何をしますか、つまり何が起こるかjustAbool、スコープを離れた後もその値を保持しますか? それとも、スコープに再び入るときに値を「記憶」しますか?

4

6 に答える 6

12

staticローカル変数に適用すると、その変数に静的ストレージ期間が与えられます。これは、justAboolの存続期間が、関数の呼び出しの最後までではなく、プログラムの最後まで続くことを意味します。宣言が表示された後、スコープは同じままで、関数内で名前によってのみアクセスできます。

justAbool= false関数が最初に呼び出されたときに(提供された初期化子を使用して) 初期化されます。その後、以前の値を保持し、関数が再度呼び出されたときに再初期化されません。

ここでは、標準への参照とともに、保存期間と有効期間に関する詳細をいくつか示します。

オブジェクトにstatic storage durationがある場合、オブジェクトのストレージはプログラムの期間中 (開始から終了まで) 持続することを意味します。(3.7.1 [basic.stc.static])

aboolは重要なコンストラクターを持たない型であるため、その寿命はストレージの寿命を反映しています。つまり、プログラムの最初から最後まで存続します。(3.8 [基本ライフ])

静的ストレージ期間を持つすべてのオブジェクト(ローカル オブジェクトを含む) は、他の初期化の前にゼロで初期化されます。(6.7/4 [stmt.decl]) [初期化子を持つローカル オブジェクトの場合、宣言に到達する前に値を読み取る方法がないため、これはかなり学術的です。]

定数式で初期化された静的ストレージ期間を持つ POD 型のローカル オブジェクトは、ブロックに入る前に初期化されます。それ以外の場合、静的ストレージ期間を持つローカル オブジェクトは、制御が宣言を通過するときに初期化されます。(再び 6.7/4)

実装は、状況によっては早期初期化を実行することを許可しますが、必須ではありません。

于 2011-02-12T09:26:34.000 に答える
1

上記の関数は、コメントで行うことを行い// Do something with justAbool;ます。

重大な注意として、はい、関数内のstatic変数 (この場合はjustAbool) は、関数から戻った後でもその値を保持します。一度だけ初期化されます。そして、連続する各呼び出しでは、それがグローバル変数であるかのように使用されます。その存続時間は、プログラムの終了と同じです。

int f()
{
   static int v = 0;
   return ++v;
}
int main()
{
   cout << f() << endl;
   cout << f() << endl;
   cout << f() << endl;
   cout << f() << endl;
}

出力:

1
2
3
4

オンラインデモ: http://www.ideone.com/rvgB5

于 2011-02-12T09:22:19.247 に答える
0

justAbool実際には通常の静的変数です。プログラムの開始時から存在し、一度だけ初期化されます。特別なことは、それがこの関数でのみ知られていることです。関数の外で使用しようとすると、コンパイラはそれが何であるかを知りません。

于 2011-02-12T09:22:27.347 に答える