1

これにつまずいただけですが、ここで何が起こっているのか誰か説明できますか?

struct Foo {
    int i;
    ~Foo() {
        std::cout << i << std::endl;
    }
};

void bar()
{
    Foo f;
    f.i = 1;
    f = Foo();
    f.i = 2;
}

次の出力が得られます。

-85899... (gibberish = "default" value for uninitialized int)
2

私が期待した場所

1
2

f.i = 1;ここで効果がないように見えるのはなぜですか?

4

4 に答える 4

11

したがって、デストラクタへの最初の呼び出しで破棄される変数は ではなくf、 によって作成された一時的なものFoo()です。コンストラクターがないため、i値は不定です。iたとえば、99999 に設定するコンストラクタを追加すると、デストラクタからの出力が表示されます。

void bar()
{
    Foo f;    // Construct f of type Foo
    f.i = 1;   // Set i to 1 in f. 
    f = Foo();   // Construct a temporary Foo object, copy it to f, 
                // then destroy the temporary object. 
    f.i = 2;   // Set the newly copied f.i to 2. 
               // destroy f.
}
于 2013-05-10T12:46:44.297 に答える
9

にはf.i = 1効果があります。メンバーiが と等しくなるように設定し1ます。デストラクタで値を出力するため、オブジェクトが破棄された場合にのみ表示されます。

f = Foo();では、不定値を持つ一時的なFooオブジェクトを作成し、iそれを object に割り当てていますf。この一時オブジェクトは行末で破棄され、独自の indeterminate が出力されiます。-85899...これが出力を与えるものです。

不確定な値はオブジェクトにコピーされますfが、そのメンバーiを値で上書きします2。の最後でbar、このオブジェクトは破棄され、出力が表示されます2

于 2013-05-10T12:47:13.733 に答える
4

これ:

f = Foo();

新しいオブジェクトを作成し、それをコピーします。その後、このオブジェクトはこの行の最後で破棄されましたが、まったく初期化されていませんでした。コピーしただけです。

于 2013-05-10T12:46:59.047 に答える
2

最初の出力は、一時的に呼び出されたデストラクタからのものです。デフォルトの代入演算子はデストラクタを呼び出さないため、表示されるデストラクタは呼び出されません1

それを説明するいくつかのコード:

struct Foo {
  int i;
  // we emulate the default operator= generated by the compiler
  // no check for self-assignment
  Foo& operator=(const Foo& other) { this->i = other.i; } 
};

void bar() {
  F f;
  f.i = 1;
  f = Foo(); // the i member of the temporary is indeterminate
             // now f.i is indeterminate
             // destroy the temporary
  f.i = 2;  
} // end of scope, destroy f
于 2013-05-10T12:47:29.137 に答える