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