7

私のコード:

#include <iostream>
using namespace std;

class Foo
{
public:
    int bar;

    Foo()
    {
        bar = 1;
        cout << "Foo() called" << endl;
    }

    Foo(int b)
    {
        bar = 0;
        Foo();
        bar += b;
        cout << "Foo(int) called" << endl;
    }
};

int main()
{
    Foo foo(5);
    cout << "foo.bar is " << foo.bar << endl;
}

出力:

Foo() called
Foo(int) called
foo.bar is 5

foo.bar値が6ではないのはなぜですか?Foo()が呼び出されますが、1に設定されていませんbar。なぜですか。

4

4 に答える 4

12

次のコンストラクターでは、with行Foo()は前のコンストラクターに委任されません。Foo代わりに、とは関係のないタイプの新しい一時オブジェクトを作成します*this

Foo(int b)
{
    bar = 0;
    Foo(); // NOTE: new temporary instead of delegation
    bar += b;
    cout << "Foo(int) called" << endl;
}

コンストラクターの委任は次のように機能します。

Foo(int b)
    : Foo()
{
    bar += b;
    cout << "Foo(int) called" << endl;
}

ただし、これはC++11でのみ可能です。

于 2012-05-25T20:08:33.603 に答える
3

通常の関数のようにコンストラクターを使用することはできません。コードでFoo()を呼び出すと、スタックに新しいオブジェクトが作成されます。

于 2012-05-25T20:09:52.540 に答える
2

コンストラクターに次の行があるため:

bar = 0;

2番目のコンストラクターのcallを使用して他のコンストラクターを呼び出そうとしていますが、一時インスタンスFoo()が作成されるだけです。Foo

于 2012-05-25T20:07:20.857 に答える
2

別のコンストラクターからコンストラクターを呼び出すことは想定されていません

見る

C ++で別のコンストラクターからコンストラクターを呼び出すことはできますか(コンストラクターチェーンを実行します)?

C++11を実行している場合を除きます

于 2012-05-25T20:10:55.390 に答える