2番目のオプションは、初期化ではなく割り当てです。ユーザー定義のデフォルトコンストラクタを持つ型では、2番目のオプションはデフォルトのコンストラクタを呼び出し、後で代入演算子(ユーザー定義かどうかに関わらず)を呼び出して値を割り当てます。
デフォルトの初期化はできません:デフォルトのコンストラクタがない属性がある場合は、参照を保持するかどうか(定数かどうか)、定数を持つかどうかを初期化子リストで初期化する必要があります。あなたは括弧内の初期化リストでそれらの価値を初期化することはできませんが、PODのタイプについて
class X {
public:
X() : array() {} // value-initializes the array
// equivalent to:
// X() { for (int i = 0; i < 10; ++i) array[i]=0; }
private:
int array[10];
};
:
配列はなく、コンストラクタ本体で、値が初期化初期化リストにすることができ
class X {
public:
X() : pod() {} // value-initializes
// equivalent to (but easier to read and subtly faster as it avoids the copy):
// X() { pod = {}; }
private:
PODType pod;
};
最後に、一部のクラスでは、デフォルトの構築後により複雑な(達成可能であれば)コンストラクタを使用して機能を提供します。
class X
{
public:
X() : v(10) {} // construct a vector of 10 default initialized integers
// equivalent to:
// X() { for (int i = 0; i < 10; ++i) v.push_back(0); }
private:
std::vector<int> v;
};
最後に、それらが実際に同等である場合、初期化リストはC++ではより慣用的です。
そのリンクでは禁止されています。私はこれがなぜリンクのみの答えが落ちるのかと思います。 – wvdz
ここに、イニシャライザーリストが推奨される理由を説明する現在のリンクがあります。 https://isocpp.org/wiki/faq/ctors#init-lists – NigoroJr