私がC ++関数を持っているとしましょう:
void foo(int x) {
static int bar = x;
}
電話をかけたfoo(3)
後、電話をかけるとfoo(4)
、barの値は3のままであると理解しています。これはなぜですか。初期化のメモリ割り当て部分が冗長である理由を理解しています。しかし、なぜ割り当ても無視されるのですか?
いくつかの異なる静的変数を検討してください。
void foo(int x) {
static int bar = x;
static std::string s1 = "baz";
static std::string s2("baz");
static int i{2}; // C++11-style uniform initialization
}
また、関数が呼び出されるたびs1
に値を「割り当てる」必要があると思います"baz"
か?どうs2
ですか?どうi
ですか?
これらのステートメントはいずれも割り当てを実行せず、すべて初期化であり、一度だけ実行されます。ステートメントに=
文字が含まれているからといって、それが割り当てになるわけではありません。
理由理由:言語は方法は、それが一度機能を実行するために、ローカル静的変数を使用するのが一般的だということであることを仕事に定義されています
bool doInit()
{
// run some one-time-only initialization code
// ...
return true;
}
void func() {
static bool init = doInit();
// ...
}
場合はinit
再び機能は、その後、呼び出されるたびに値が割り当てられてしまっdoInit()
複数回呼び出さなるだろう、と1回限りのセットアップを実行し、その目的を失敗していましたが。
呼び出されるたびに値を変更したい場合は、簡単です...変更するだけです。あなたがいる場合でも、していない、それは変更を維持したい、言語が道を働いていた場合について、あなたは求めていることを実行する方法はありません。
static const
ローカル変数を持つことも不可能です:
void func() {
static const bool init = doInit();
// ...
}
おっと、これはinit
呼び出されるたびにの値を変更しようとします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加