Как я могу использовать список инициализации члена для инициализации массива?

class A {
public:
   A();

private:
   char a[5];
   int* ptr;
};

A::A() : a(0), ptr(0) { }

Это правильно?

2 ответа

Решение

Единственная разумная вещь, которую вы можете сделать с C-массивом в C++03, - это инициализировать значение (в C++11 и более поздних версиях его можно инициализировать списком).

Из стандарта C++03, §8.5/7:

Объект, инициализатором которого является пустой набор скобок, т. Е. (), Должен быть инициализирован значением.

А из §8.5/5:

Инициализировать значение объекта типа T средства:

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

Для инициализации нуля объекта типа T средства:

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

Итак, если ваше определение конструктора изменено на

A::A() : a(), ptr() { }

то вам гарантировано, что после постройки все 5 элементов A::a будет иметь значение '\0' а также A::ptr будет нулевым

Не боюсь; C++ не поддерживает инициализацию таких массивов.

Вы просто должны назначить его членам в Aтело конструктора, или вы можете использовать инициализацию значения, если вам действительно все равно, что это за значения:

struct A {
   int x[5];
   A() : x();
};

C++ 0x позволяет вам указать все значения:

struct A {
   int x[5];
   A() : x{1,2,3,4,5} {}
};

Обратите внимание, что, поскольку массивы не class-objects, вы не сможете сделать это:

struct A {
   int x[5];
   A(std::initializer_list<int[5]>& i) // or whatever the T should be
      : x{i} // or x(i)
        {}
}
A a({1,2,3,4,5)};
Другие вопросы по тегам