Инициализация структуры по умолчанию в C++

Скажите, что у меня есть структура, которая похожа на это (POD):

struct Foo
{
  int i;
  double d;
};

Что является различиями между следующими двумя строками:

Foo* f1 = new Foo;
Foo* f2 = new Foo();
7
задан criddell 1 June 2010 в 16:38
поделиться

3 ответа

Первый оставляет значения неинициализированными; второй обнуляет их. Это справедливо только для типов POD, у которых нет конструкторов.

13
ответ дан 6 December 2019 в 21:10
поделиться

Я вообще ничего не думаю. 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! )

1
ответ дан 6 December 2019 в 21:10
поделиться

По опубликованной мной ссылке.

В C ++ единственное различие между классом и структурой состоит в том, что члены класса по умолчанию являются закрытыми, а члены структуры по умолчанию являются общедоступными. Таким образом, структуры могут иметь конструкторы, а синтаксис такой же, как и для классов.

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

-2
ответ дан 6 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: