Инициализация структуры по умолчанию в C ++ - PullRequest
7 голосов
/ 01 июня 2010

Скажем, у меня есть структура, которая выглядит следующим образом (POD):

struct Foo
{
  int i;
  double d;
};

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

Foo* f1 = new Foo;
Foo* f2 = new Foo();

Ответы [ 3 ]

13 голосов
/ 01 июня 2010

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

1 голос
/ 01 июня 2010

Полагаю, вообще ничего. Foo() разрешено, даже если это не имеет смысла ... Я попытался изменить struct на class и попробовал diff на сгенерированном 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 ++. ..

В любом случае с «функциональной» (практической) точки зрения это одно и то же.

Добавить

В конце всегда лучше узнать или провести более глубокое расследование некоторых типичных человеческих проблем на сайтах Q / A ... единственное отличие в коде, сгенерированном g ++ в () и без () случаях,

    movl    $0, (%eax)
    fldz
    fstpl   4(%eax)

, который является фрагментом, который инициализирует в 0 / 0.0 целое и двойное число структуры ... так что Сеймур знает это лучше (но я мог бы обнаружить это, не зная, взглянул ли я сначала на асм!)

0 голосов
/ 01 июня 2010

По ссылке, которую я разместил.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...