Как инициализировать член-структуру в списке инициализаторов класса C ++? - PullRequest
45 голосов
/ 17 ноября 2010

У меня есть следующие определения классов в c ++:

struct Foo {
  int x;
  char array[24];
  short* y;
};

class Bar {
  Bar();

  int x;
  Foo foo;
};

и я хотел бы инициализировать структуру "foo" (со всеми ее членами) в ноль в инициализаторе класса Bar.Можно ли это сделать так:

Bar::Bar()
  : foo(),
    x(8) {
}

...?

Или что именно делает foo (x) в списке инициализаторов?

Или структура даже инициализируется автоматически с нуля от компилятора?

Ответы [ 2 ]

50 голосов
/ 17 ноября 2010

Прежде всего, вы должны (должны!) Прочитать это c ++ faq относительно POD и агрегатов.В вашем случае Foo действительно является классом POD, а foo() является инициализацией значения :

Инициализация значения объекта типа T означает:

  • , если T является типом класса (раздел 9) с объявленным пользователем конструктором (12.1), тогда вызывается конструктор по умолчанию
    для T (и инициализация является некорректной, если у T нет доступныхконструктор по умолчанию);
  • если T является типом класса без объединения без конструктора, объявленного пользователем, то каждый нестатический член данных и компонент базового класса T инициализируется значением;
  • если T является типом массива, то каждый элемент инициализируется значением;
  • в противном случае объект инициализируется нулями

Так что да, foo будет иметь нулевую инициализацию.Обратите внимание, что если вы удалили эту инициализацию из конструктора Bar, foo будет только инициализированным по умолчанию :

Если для объекта не указан инициализатор и объектимеет (возможно, cv-квалифицированный) не относящийся к POD тип класса (или его массив), объект должен быть инициализирован по умолчанию;если объект имеет константный тип, базовый тип класса должен иметь объявленный пользователем конструктор по умолчанию. В противном случае, если для нестатического объекта не указан инициализатор, объект и его подобъекты, если таковые имеются, имеют неопределенное начальное значение ;

8 голосов
/ 17 ноября 2010

В стандартном C ++ вам нужно создать ctor для Foo.

struct Foo {

  Foo(int const a, std::initializer_list<char> const b, short* c)
    : x(a), y(c) {
    assert(b.size() >= 24, "err");
    std::copy(b.begin(), b.begin() + 24, array);
  }

  ~Foo() { delete y; }

  int x;
  char array[24];
  short* y;
};

class Bar {

  Bar() : x(5), foo(5, {'a', 'b', ..., 'y', 'z'},
    new short(5)) { }

  private:

  int x;
  Foo foo;
};

В C ++ 0x вы можете использовать единый список инициализации, но все же вам нужен dtor для Foo:

class Bar {

  Bar() : x(5), foo{5, new char[24]{'a', 'b', ..., 'y', 'z'},
    new short(5)} { }
  ~Bar() { delete[] foo.array; delete foo.y;}
  }
  private:

  int x;
  Foo foo;
};

Чтобы по умолчанию инициализировать foo (как Bar() : foo(), x(8) { }), вам нужно дать Foo значение ctor по умолчанию.

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