Вот код:
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 (он создается), но я не хочу тратить время на конструкцию default-construct-anonymous-instance-then-copy-like, как item2.
Разочаровывающе, я не могу заставить конструкцию по умолчанию сказать MyClass item1();
, поскольку это интерпретируется как прототип функции.
Итак... если я хочу использовать конструктор по умолчанию для item1 без создания копии, как я это делаю?
Боковое примечание: похоже, если я объявляю конструктор для MyClass, item1 создается как обычно. Поэтому это поведение применяется только к конструкторам, сгенерированным компилятором.