実際には3つの方法がありますが、そのうちの2つはすでにここで言及されています。私は理由とともに要約します:
1)変数を静的として宣言します。
void callMe()
{
static int count=0;
cout<<"I am called "<<++count<<" times!\n";
}
これが機能するのは、関数が呼び出されるたびにカウントのコピーを作成し、関数の実行時にそれを削除するのではなく、メモリがカウントのコピーを1つ作成するようになったためです。また、ここで注目に値するのは、カウントがまだ関数に対してローカルであるということです。つまり、次のようなことを行おうとした場合です。
int main()
{
int count;
callMe();
callMe();
callMe();
callMe();
cout<<"you called "<<count<<"functions!\n";
return 0;
}
関数のカウントとメインのカウントは2つの異なる場所にある2つの異なる変数であるため、countは引き続きガベージ値を表示します。
2)グローバル変数を初期化します。
int count=0;
void callMe()
{
cout<<"I am called "<<++count<<" times!\n";
}
上記の例では、変数のスコープはグローバルであるため、プログラム全体で変数の単一のコピーが使用されます。したがって、どこかで行われた変更は、プログラムのすべての場所に反映されます。3つ以上の機能を監視する必要がある場合は、このアプローチを使用できます。例:
int count=0;
void callMe()
{
cout<<"I am called "<<++count<<" times!\n";
}
void callMe2()
{
cout<<"I am called 2 "<<++count<<" times!\n";
}
int main()
{
callMe();
callMe();
callMe2();
callMe2();
cout<<"you called "<<count<<" functions!\n";
return 0;
}
ここでのカウントは基本的に関数とメインの両方に共通であるため、独自のローカルコピーを作成するのではなく、すべて同じ値を参照します。同じ名前の変数があると、混乱する可能性があります。グローバル変数と静的変数の違いとそのスコープを理解するには、ここをクリックしてください
3)変数の参照を渡します。
void callMe(int &count)
{
cout<<"I am called "<<count++<<" times!\n";
}
void callMe2(int &count)
{
cout<<"I am called 2 "<<++count<<" times!\n";
}
int main()
{
int count=0;
callMe(count);
callMe(count);
callMe2(count);
callMe2(count);
cout<<"you called "<<count<<" functions!\n";
return 0;
}
これはおそらくこれを行うための最もクリーンな方法です。変数はメインに対してローカルであり(ガベージコレクションの複雑さを軽減します)、これは参照によるパスであるため、行われたすべての変更はメモリ内の同じ場所を指します。これに従わない確固たる理由がない場合は、これを使用すると思います。
私があなたをさらに混乱させないことを願っています、ハッピーハンティング。