2010-12-30 6 views
4

可能性の重複:
Do the parentheses after the type name make a difference with new?C++ - どちらが「新車」または「新車()」を使用することになっていますか?

こんにちはすべて、ここで

class Car 
{ 
public: 
    Car() : m_iPrice(0) {} 
    Car(int iPrice) : m_iPrice(iPrice) {} 

private: 
    int m_iPrice; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Car car1; // Line 1 
    Car car2(); // Line 2, this statement declares a function instead. 

    Car* pCar = new Car; // Line 3 
    Car* pCar2 = new Car(); // Line 4 

    return 0; 
} 

は私の質問です:

私たちは車のオブジェクトを定義するとき、私たちが使用する必要がありますライン2ではなくライン1。 私たちは新しいオブジェクトで、Line 3とLine 4の両方がVC8.0のコンパイラを渡すことができます。 しかし、3行目または4行目の方がいいですか?または、3行目は

はあなたの線が等価である。この場合

+2

議論されてきたが、新しいとの違いを生みますか? ](@stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new) – birryree

+0

@birryree:一般的にはい(違いは値の初期化とゼロ初期化)。この特定のインスタンスでは、いいえ。なぜなら、Carは明示的に定義されたデフォルトのコンストラクタを持つ非常に単純なクラス(intメンバのみ)であるからです。 –

+0

@Martin - あなたは質問に答えていますか?それは私がリンクしている質問のタイトルです。:) – birryree

答えて

6

ありがとうございライン4に等しいです。操作上の違いはありません。

ただし、このような行は常に等価であることを意味するものではありません。あなたのデータ型がPODである場合(つまり、単純な構造体: - この場合には0にそれらをセットすなわちその後new Fooが初期化されていないオブジェクトを生成し、new Foo()

struct Foo 
{ 
    int a; 
    float b; 
}; 

は、すべてのフィールドを値が初​​期化値initalizationコンストラクタを呼び出し、

new Foo()に誤って呼び出すのは簡単ですので、オブジェクトの初期化を忘れてしまいます(これは問題ありません)。誤ってPOD以外のクラスにしてしまいます。オブジェクトは再び初期化されません)、常にnew Fooを呼び出すほうが若干優れています(ただし、一部のMSVCバージョンで警告が表示されます) 。

2

newにユーザーが宣言したコンストラクタがある場合は違いはありません。

Line12 Line 4は、すべてのメンバーを最初に0に初期化します(ただし、ユーザーがコンストラクターを宣言したメンバーのコンストラクターを呼び出すだけです)。それをしたくない場合は、Line 3を使用してください。このルールは、仮想メンバ関数、基本クラスなどを持つ複雑なオブジェクトに対しても行われます。ただし、そのクラスには、ユーザーが宣言したコンストラクタがあるかどうかが条件です。

これはC++の非常に微妙なコーナーです。私はこれらの事実に基づいてコードを作成することはできません。コード内でコードを説明しなくてもかまいません(そうだと思います。

+0

新しいクラスのデフォルトのコンストラクタではなく、すべてのメンバーとベースのクラスが影響を受ける可能性があります。 –

+0

@Martinメンバーにユーザー宣言されたコンストラクタがある場合、デフォルトのコンストラクタが呼び出されようとします。会員には触れられません。ユーザーが宣言したコンストラクタがない場合、メンバーと基底が初期化されます。私は "基盤"を見逃していました - すぐにそれを追加します。 –

関連する問題