2012-04-12 20 views
0

私はこのことが正しい理由に困惑しています。戻り値は参照型int&, ですが、h()関数は文return xに値intを返します。したがって、intの返品はどのようにint &に変更されますか?コードスニペットの戻り値の型を理解できません

これはコードスニペットであり、C++コンパイラで正常にコンパイルされます。

int& h() { 
int q; 
static int x; 
return x; 
} 

答えて

4

これは、スタティックintへの参照を返します。 xは、初めて関数hが呼び出されたときに初期化されます。このようにそれを使用します。

int& href = h(); 
++href; // increments the static variable 
int& href2 = h(); // another reference to the same static variable 

変数qは効果がありません必要があり、私はそれは疑わしい検討します。

+0

少しわかります – user1279988

1

参照は、あなたが実際にコードをwritttenされていた場合はそう返されたものの値を変更すると、直接xの値を変更します効果的に同じ変数を返していることを意味します

int h() 
{ 
    int q; 
    static int x; 
    return x; 
} 

(すなわちではありません)の値のコピーを返すことになります(ただし、公正なチェックアウトはReturn Value Optimizationである必要があります)。しかし、リファレンスを返すことは効率的ですが、時間がかかります(マルチスレッドは明白な例です)。それは望ましくなく混乱することがあります。

1

int&はintへの参照です。 xはintです。したがって、int&を返す関数からのreturn x;は、xへの参照を返します。また

:関数が終了したときに、ローカル変数が破壊されているのでローカル変数への参照を返す

は、危険です。参照を取得するまでに、参照するものは存在しません。これはダングリングリファレンスと呼ばれ、何も指していないポインタのようなものです。

静的変数はローカル変数ではなく、関数が終了すると破棄されません。したがって、参照が有効なオブジェクトを取得した時点でそのオブジェクトを指し示しています。

関連する問題