#include<iostream>
using namespace std;
int &fun()
{
static int x;
return x;
}
int main()
{
fun() = 10;
cout<<fun();
return 0;
}
上記のプログラムは 10 を出力します。しかし、このプログラムが実際にどのように動作するかについて、私は混乱しています。
#include<iostream>
using namespace std;
int &fun()
{
static int x;
return x;
}
int main()
{
fun() = 10;
cout<<fun();
return 0;
}
上記のプログラムは 10 を出力します。しかし、このプログラムが実際にどのように動作するかについて、私は混乱しています。
fun()
x
の最初の式で、静的変数 の参照を返しますmain()
:
fun() = 10;
^ ^
| x assigned 10
returned x
静的変数の値は異なる関数呼び出し間で保持されるため、次の式では:
cout << fun();
^
return x with value 10
注:静的変数の参照を返しているため、未定義の動作ではありません。
関数 fun() 内に static int 変数があります。
関数はその変数への参照を返します。
変数に 10 を割り当てます。
変数を出力します。
関数は参照を返すため、基になる静的変数を変更できます。
最初の呼び出しで、static int
変数が作成され、それへの参照が返されます。次に、の値x
を 10 に設定します。
ステートメントはcout
再び参照を取得し、それを使用してx
stdout に書き込みます。
wast でない場合x
、static
関数スコープの最後で破棄され、返される参照が temporary への参照になることに注意してください。これは違法です。
最も一般的な実用的なアプリケーションは次のとおりです。operator[]
class ArrayWrapper {
int v [100];
public:
int& operator[] (int index) {
return v[index];
}
};
// usage:
ArrayWrapper aw;
aw[3] = 3;
cout << aw[10];
もちろん、これは実装例です。実際の過負荷については、またはop[]
を参照してください。std::vector
std::map
fun
は静的変数 への参照を返しますx
。これを使用して の値を変更できますx
。C に相当するものは次のようになります。
int *fun()
{
static int x;
return &x;
}
int main()
{
int *ptr = fun();
*ptr = 10;
printf("%d\n", *fun());
return 0;
}
関数は静的変数への参照を返しています。関数が終了した後も、静的変数は存在し続けます。
関数は参照を返すため、その値を設定して画面に出力できます。これは基本的に、グローバル変数を「隠す」ことです。ただし、この手法をどこで使用するのが理にかなっているのかはわかりません...
f 内の静的変数 x への参照は、値 10 を x に割り当てるために使用されています。それ(参照)はその後coutに渡されます
静的変数は基本的に、単一の関数からのみ直接アクセスできるグローバルです。関数がこの変数への参照を返す場合、実際にはそのアドレスを返します。変数はグローバルであるため、常に同じアドレスであるため、関数は実際にすべての人にこの変数へのアクセスを許可しています。