web-dev-qa-db-ja.com

C ++でオブジェクトを初期化するさまざまな方法

これは重複する質問だと思いますが、しばらく探していましたが、賢くなりませんでした。

このクラスを想像してください:

class Entity {
public:
    int x, y;

    Entity() : x(0), y(0) { }
    Entity(int x, int y) : x(x), y(y) { }
}

そしてここにクラスを初期化する複数の方法があります:

Entity ent1;
Entity ent2();
Entity ent3(1, 2);
Entity ent4 = Entity();
Entity ent5 = Entity(2, 3);

また、ヒープメモリ上にオブジェクトを作成することも可能ですが、現時点ではそれは大きな謎ではありません。

これが私が知っていると思うものです

ent1-デフォルトのコンストラクタを使用するため、x = 0およびy = 0

ent2-デフォルトのコンストラクタを使用するため、x = 0およびy = 0(不明)

ent3-コンストラクターを作成したため、x = 1およびy = 2

ent4-デフォルトのコンストラクタなので、x = 0およびy = 0

ent5-コンストラクタを作成したため、x = 2およびy = 3

私が間違っていたら訂正してください。しかし、私の質問は、オブジェクトを初期化するこれらの方法の違いは何ですか?

どれを使うべきかわからない。


7
user6346900
Entity ent1;

このステートメントは、クラスEntityのデフォルトのコンストラクターを使用します。

Entity ent2();

この定義は、可能であれば、コンパイラによって関数プロトタイプとして扱われます。

Entity ent3(1, 2);

ユーザー定義コンストラクターがent3に対して呼び出されます。

Entity ent4 = Entity();

これはproperent2ケースのバージョンです。デフォルトのコンストラクターは、値の初期化の一部として呼び出されます。その形式により、ほとんどのVexing解析-ent2を不正確にするあいまいさの解決原理を回避できます。

Entity ent5 = Entity(2, 3);

Ent3ケースのバージョン。値の初期化の一部として呼び出されるユーザー定義のコンストラクター。

あなたの質問にはC++ 11のタグが付けられており、C++ 11では初期化構文が統一されています。

Entity ent12{};     // This is a legal alternative of ent2 case
Entity ent13{1, 2};
Entity ent14 = {};
Entity ent15 = Entity{2, 3};

統一初期化構文には注意点があることに注意してください。例えば。この線

std::vector<int> v(10); 

10要素のベクトルを宣言します。しかし、これは

std::vector<int> v{10};

は、値が10のint型の単一要素で初期化されたベクトルを宣言します。これは、std::vectorに次のシグネチャが定義されたコンストラクタがあるために発生します。

vector( std::initializer_list<T> init, const Allocator& alloc = Allocator() );

不要なコンストラクターを呼び出さずにMVPをトリガーせずに()も{}も使用できない場合、値の初期化割り当て構文により問題を解決できます。

12