Скажите, что у меня есть структура, которая похожа на это (POD):
struct Foo
{
int i;
double d;
};
Что является различиями между следующими двумя строками:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
Первый оставляет значения неинициализированными; второй обнуляет их. Это справедливо только для типов POD, у которых нет конструкторов.
Я вообще ничего не думаю. Foo ()
разрешено, даже если это не имеет смысла ... Я попытался изменить struct
на класс
и попытался сравнить сгенерированный exe , и они оказались одинаковыми, что означает, что класс без метода похож на структуру с практической и «эффективной» точки зрения.
Но : если вы используете только один из альтернативы, сохраняя struct
или class
, неважно, то случается, что new Foo
и new Foo ()
дает исполняемые файлы, которые отличаются! (По крайней мере, используя g ++) Т.е.
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo; delete f1; }
компилируется в нечто отличное от
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo(); delete f1; }
, и то же самое происходит с class
вместо struct
. Чтобы узнать, в чем разница, мы должны взглянуть на сгенерированный код ... и чтобы узнать, является ли это идиосинкразией g ++ или нет, я должен попробовать другой компилятор, но у меня есть только gcc, и сейчас нет времени для анализа вывода asm g ++. ..
В любом случае с «функциональной» (практической) точки зрения это одно и то же.
Добавить
В конце всегда лучше узнать или провести более глубокое исследование некоторых типичных человеческих проблем на сайтах вопросов и ответов ... Единственная разница в коде, сгенерированном g ++ в случаях () и no () ,
movl $0, (%eax) fldz fstpl 4(%eax)
, который является фрагментом, который инициализирует 0 / 0.0 int и double структуры ... так что Сеймуру это известно лучше (но я мог бы обнаружить его, не зная, взглянул ли я сначала на asm! )
По опубликованной мной ссылке.
В C ++ единственное различие между классом и структурой состоит в том, что члены класса по умолчанию являются закрытыми, а члены структуры по умолчанию являются общедоступными. Таким образом, структуры могут иметь конструкторы, а синтаксис такой же, как и для классов.