ここにいくつかのコードがあります:
class MyClass
{
public:
int y;
};
int main()
{
MyClass item1;
MyClass item2 = MyClass();
}
これを実行すると、次の値を受け取ります。
item1.y == [garbage]
item2.y == 0
それは、まあ、私を驚かせます。
item1 がデフォルトで構築され、item2 が MyClass の匿名のデフォルトで構築されたインスタンスからコピー構築されることを期待した結果、両方とも 0 になります (デフォルト コンストラクターはメンバーをデフォルト値に初期化するため)。アセンブリの検査:
//MyClass item1;
//MyClass item2 = MyClass();
xor eax,eax
mov dword ptr [ebp-128h],eax
mov ecx,dword ptr [ebp-128h]
mov dword ptr [item2],ecx
item2 は、一時的な場所に「0」値を書き込み、それを item2 にコピーすることによって構築されていることを示しています。ただし、item1 のアセンブリはありません。
したがって、プログラムは item1 のメモリをスタックに持っていますが、item1 を構築することはありません。
速度のためにその動作を望んでいることは理解できますが、両方の長所が欲しいのです! item1.y == 0 (構築されます) を知りたいのですが、item2 のように default-construct-anonymous-instance-then-copy-construct で時間を無駄にしたくありません。
MyClass item1();
イライラすることに、関数プロトタイプとして解釈されるため、デフォルト構成を強制することはできません。
だから...コピー構築もせずにitem1でデフォルトのコンストラクターを使用したい場合、どうすればいいのでしょうか?
補足: MyClass のコンストラクターを宣言すると、item1 が通常どおりに構築されるように見えます。したがって、この動作は、コンパイラによって生成されたコンストラクターにのみ適用されます。