2012-03-07 3 views
0

私は、次のクラスを持っている場合:C++のコンストラクタの違い

class A{ 
private: 
    int x; 
public: 
    A(){ 
    x = 5; 
    } 
}; 

いただきましこれらの2つの宣言の違いは?

A a; 

A a(); 

感謝。

答えて

8
A a; 

これはタイプAのオブジェクトを作成し、デフォルトのコンストラクタを呼び出します。

A a(); 

これはタイプAのオブジェクトを返すaと呼ばれる関数を宣言。

+2

また、最も厄介な解析とも呼ばれます。 –

+1

私は、「A a(B());」という行を記述するのに使用される「最も厄介な構文解析」というフレーズを見てきました。私はそれが 'A(); 'を記述するのに使われているのを見たことはありませんが、多分それも重要です。 – interjay

+0

それは他のものに関数宣言を好む曖昧さ回避ルールです。 –

2

第二コードは、引数なし戻り型Aと機能aを宣言aと呼ばれるオブジェクトを定義していません。 C++コンパイラのこのプロパティは、一般にmost vexing parseとして知られています。

2
A a; 

これは、クラスAの要素を宣言し、デフォルトのコンストラクタを使用して構築します。

A a(); 

これはaは、パラメータを取らないと型Aのオブジェクトを返すという関数を宣言します。

3

おそらく次の2行の間に差があること、他の人が言ったことに加えて、注意することは興味深いです:

A* a = new A; 
A* a = new A(); // or new A{} 
:次の2行の間

A a; 
A a{}; // Using uniform initialization from C++11 to avoid the ambiguity 

もが

各例の最初の行では、オブジェクトはデフォルトで初期化されています。 2行目では、オブジェクトが値で初期化されます。違いは、default-initializationはAのデフォルトコンストラクタを呼び出しますが、value-initializationはオブジェクトをゼロ初期化してから、デフォルトのコンストラクタを呼び出します(ユーザが提供するコンストラクタがない場合)。

クラス型でないものについては、default-initializationは初期化を行いません。クラス型でないものや、ユーザー提供のコンストラクタのない共用体の場合は、値の初期化によってオブジェクトがゼロ初期化されます。

関連する問題