2017-06-05 2 views
3
// Example program 
#include <iostream> 
#include <string> 

struct foo 
{ 
    int d_member; 

    foo(const int & in): 
    d_member(in){}; 
}; 

int main() 
{ 
    foo *p; 

    { 
     int temp = 5; 
     p = new foo(temp); 
    } 

    std::cout << p->d_member << std::endl; 

    return 0; 
} 

Fooはconst refをintに渡し、一時的なintを渡します。新しい後に 一時は破棄されます。なぜ私はまだd_memberを印刷できるのですか?なぜtemp変数をctor workのconst refに渡すのですか?

+3

それを'const'もなくても動作します。 – juanchopanza

+2

コンストラクタ呼び出しを超えて参照を保持していないためです。 –

+0

'd_member'を' const int&d_member; '、* then *に変更すると、' d_member'も 'temp'に束縛され、' temp'がなくなるので問題があります。ほとんどのコンパイラでスタックがどのように動作するかによって、動作は変わらないでしょうが、標準では 'p-> d_member'を評価しようとするときに何が起こるのかを規定していません。その時点で、プログラムは技術的に*未定義の動作*を持ち、(1)クラッシュ、(2)あなたが望むやり方、(3)なんかなど何かをすることができます。 – cdhowie

答えて

6

コンストラクタの初期化リストは、メンバ変数の整数引数をコピーします。メンバ変数の存続期間は、オブジェクトの存続期間です。

3

はい、tempは破壊されましたが、その前にはd_member(in)の初期化中にコピーされました。ここで何も間違っていません

6

参照変数以外の変数で既に述べたように、コンストラクタコールは単にconst参照パラメータから値をコピーします(リファレンスや値で渡しても問題ありません)。

あなたのメンバ変数は、その場合

struct foo 
{ 
    const int& d_member; // <<<< reference member variable 

    foo(const int & in): d_member(in){}; 
}; 

同様の参照がある場合は、未定義の動作引き上げるスコープブロックの後d_memberにアクセスし、さまざまな状況があります:

{ 
    int temp = 5; 
    p = new foo(temp); 
} 

std::cout << p->d_member << std::endl; // <<<< Undefined behavior 
関連する問題