1

私はどこかで読んだ(今はソースを見つけることができない)

MyClass *p1 = new MyClass;

MyClass *p2 = new MyClass();

MyClassデフォルトのコンストラクターを提供する場合、基本的に同等です。コンパイラは私がやりたいことを理解し、空の括弧を追加します。

もしそうなら、なぜ私は書くことが許されないのですか

throw MyException;

しかし、使用する必要があります

throw MyException();

?(はい、行頭の疑問符です。)

さらに混乱を加えるために、C ++ FAQは、2番目のユースケース(new MyClass())がコンストラクターを呼び出さず、代わりにで定義された関数を呼び出すことを提案していoperator()ます。

4

3 に答える 3

3

コンパイラは私がやりたいことを理解し、空の括弧を追加します。

いいえ、そうではありません。2つの式は完全に同等ではありません。違いは、オブジェクトの初期化方法にあります。最初のオブジェクトはデフォルトの初期化を使用し、2番目のオブジェクトは値の初期化を使用します。したがって、これらはデフォルトのコンストラクターを定義するクラスと同等です。それ以外の場合、最初のオブジェクトはPODオブジェクトを初期化せずに残し、2番目のオブジェクトはそれらをゼロに初期化します。

なぜ私は書くことが許されないのthrow MyException;ですか?

MyException()値で初期化された一時オブジェクトを作成する式です。他の適切な式の値をスローするのと同じように、それをスローできます。

MyException表現ではありません。単なるタイプ名です。式の値のみをスローできるため、throw MyException;は無効です。デフォルトで初期化された一時的なものを作成する方法はありません。

さらに混乱を加えるために、C ++ FAQは、2番目のユースケース(new MyClass())がコンストラクターを呼び出さず、代わりにoperator()で定義された関数を呼び出すことを提案しています。

いいえ、そうではありません。これは、のような宣言が、 (考えられるように)型の値で初期化されたオブジェクトではなくList x();、戻り型の関数を宣言することを示しています。new-expressionsまたはとは何の関係もありません。ListListoperator()

于 2012-09-27T12:01:51.127 に答える
1

new例外をスローするのではなく、それを構築するからです。

次のことを検討してください。

MyException exception = MyException(); // works
MyException exception = MyException; // doesn't work

new MyException; // works
new MyException();// works
于 2012-09-27T11:51:11.623 に答える
0

FAQに記載されている状況は異なり、ここでは当てはまりません。

MyException最初のケースでは単なるタイプ名であり、2番目のケースでは変数を作成します。それはただの構文です。と同じ

MyException ex = MyException;

コンパイルされませんが、

MyException ex = MyException();

だろう。FAQの例は、次と同等のものを示しています。

MyException ex();

これは確かに関数宣言になりますが、次のようになります。

MyException ex;

だろう。

その方法はありません

throw MyException();

また

MyException ex = MyException();

関数宣言として解釈できるので、機能します。

于 2012-09-27T11:50:47.070 に答える