Инициализация структуры по умолчанию в 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++ единственное различие между классом и структурой состоит в том, что члены класса по умолчанию являются закрытыми, в то время как члены структуры по умолчанию являются открытыми. Таким образом, структуры могут иметь конструкторы, и синтаксис такой же, как и для классов.

Информация о конструкторе конструкций

Другие вопросы по тегам