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

class A { public: A(); private: char a[5]; int* ptr; }; A::A() : a(0), ptr(0) { } 

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

2 Solutions collect form web for “Как я могу использовать список инициализации членов для инициализации массива?”

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

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

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

И из § 8.5 / 5:

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

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

Для нулевой инициализации объекта типа T означает:

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

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

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

то вам гарантируется, что пост-строительство, все 5 элементов из A::a будут иметь значение '\0' а A::ptr будет равно NULL.

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

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

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

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

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

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

 struct A { int x[5]; A(std::initializer_list& i) // or whatever the T should be : x{i} // or x(i) {} } A a({1,2,3,4,5)}; 
  • Структурный конструктор в C ++?
  • Почему это () и super () должны быть первым утверждением в конструкторе?
  • Конструктор шаблонов C ++
  • Является ли конструктор по умолчанию инициализацией встроенных типов?
  • Методы против конструкторов в Java
  • Могут ли конструкторы быть асинхронными?
  • Кто удаляет память, выделенную во время «новой» операции, которая имеет исключение в конструкторе?
  • Можно ли явно указать параметры шаблона конструктора?
  • В чем смысл сеттеров и геттеров в java?
  • Почему нет вызова конструктору?
  • Что означает явное ключевое слово?
  • Interesting Posts
    Давайте будем гением компьютера.