-1

MSVC に関する次の 3 つのコードの違いは何ですか?

コード 1: 次のように定義された Foo ctor:

Foo::Foo(Bar &bar = Bar());

次のように使用されるフッター:

Foo foo = new Foo();

コード 2: 次のように定義された Foo ctor:

Foo::Foo()
{
    Bar bar = Bar();
    Foo(bar);
}

Foo::Foo(Bar &bar);

次のように使用されるフッター:

Foo foo = new foo();

コード 3: 次のように定義された Foo ctor:

Foo::Foo(Bar &bar);

次のように使用されるフッター:

Bar bar = Bar();
Foo foo = new foo(bar);

編集: コードに修正を加えました。意図はアイデアを説明することでしたが、コードに焦点を合わせていなかったため、間違いを犯しました。申し訳ありません。

具体的な問題は、コード 2 と 3 の違いを理解することです。何らかの理由により、コード 2 の場合、Foo クラス ctor のコンシューマがクラッシュし、コード 3 の場合はクラッシュしません。私は消費者の特定のコードを持っていないので、自分でそれを理解することはできません.

4

1 に答える 1

3

最初の 2 つは、コンストラクターを呼び出すのではなく、関数を宣言しています。

Foo foo(); // function foo, returns a Foo object

デフォルトで a を構築するFooには、必要です

Foo foo;   // C++11 and C++03
Foo foo{}; // C++11

あなたのコードのほとんどは違法であるか、期待どおりに動作しません。たとえば、このコンストラクターは、ローカルBar変数を作成し、同じ名前でbarインスタンス型を作成しようとする以外は何もしません。Foo

Foo::Foo()
{
    Bar bar = Bar(); // local variable bar
    Foo(bar);        // error: 'bar' has a previous declaration as 'Bar bar'
}
于 2014-03-09T08:24:38.210 に答える