2012-02-28 17 views
5

可能性の重複:もちろん
Why is it an error to use an empty set of brackets to call a constructor with no arguments?かっこ付きかどうかでクラスをインスタンス化しますか?

#include <iostream> 
using namespace std; 

class CTest 
{ 
    int x; 

    public: 
    CTest() 
    { 
     x = 3; 
     cout << "A"; 
    } 
}; 

int main() { 
    CTest t1; 
    CTest t2(); 

    return 0; 
} 

CTEST T1版画 "A"。

しかし、t2()では何も起こらないようですが、コードはうまく動作します。

私たちは引数なしでそれらのカッコを使用しますか?それとも、なぜこのように使うことができますか?

+0

C++の[最も厄介な構文解析](http://en.wikipedia.org/wiki/Most_vexing_parse)です。 –

+0

@PeterWood:個人的に、私はそれに反対します。歴史的に、「最も厄介な解析」は、一時的に初期化された値である初期値であいまいさが発生する場合のみを指していた。 'CTest t2(CTest());'この単純な場合よりむしろ。 –

+0

@CharlesBailey 'は最も厄介な構文解析に関連していました。ありがとう。 –

答えて

14

これはC++構文の癖です。ライン

CTest t1; 

t1名前付きの型CTestのローカル変数を宣言します。それは暗黙的にデフォルトのコンストラクタを呼び出します。一方、ライン

CTest t2(); 

ない変数宣言が、引数を取らず、CTestを返すt2呼び出される関数の局所的なプロトタイプです。 t2のコンストラクタが呼び出されない理由は、ここにオブジェクトが作成されていないためです。

オブジェクト型のローカル変数を宣言し、デフォルトコンストラクタを使用する場合は、かっこは省略してください。

C++ 11では、あなたは、代わりに、実際にデフォルトコンストラクタを呼び出すん

CTest t2{}; 

を言うことができます。

希望すると便利です。

+8

あなたは 'CTest t1; CTest t2 = CTest(); ' –

関連する問題