私は、次のクラスを持っている場合:C++のコンストラクタの違い
class A{
private:
int x;
public:
A(){
x = 5;
}
};
いただきましこれらの2つの宣言の違いは?
A a;
対
A a();
感謝。
私は、次のクラスを持っている場合:C++のコンストラクタの違い
class A{
private:
int x;
public:
A(){
x = 5;
}
};
いただきましこれらの2つの宣言の違いは?
A a;
対
A a();
感謝。
A a;
これはタイプA
のオブジェクトを作成し、デフォルトのコンストラクタを呼び出します。
A a();
これはタイプA
のオブジェクトを返すa
と呼ばれる関数を宣言。
第二コードは、引数なし戻り型A
と機能a
を宣言、a
と呼ばれるオブジェクトを定義していません。 C++コンパイラのこのプロパティは、一般にmost vexing parseとして知られています。
A a;
これは、クラスA
の要素を宣言し、デフォルトのコンストラクタを使用して構築します。
A a();
これはa
は、パラメータを取らないと型A
のオブジェクトを返すという関数を宣言します。
おそらく次の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は初期化を行いません。クラス型でないものや、ユーザー提供のコンストラクタのない共用体の場合は、値の初期化によってオブジェクトがゼロ初期化されます。
また、最も厄介な解析とも呼ばれます。 –
私は、「A a(B());」という行を記述するのに使用される「最も厄介な構文解析」というフレーズを見てきました。私はそれが 'A(); 'を記述するのに使われているのを見たことはありませんが、多分それも重要です。 – interjay
それは他のものに関数宣言を好む曖昧さ回避ルールです。 –