Как я могу использовать список инициализации члена для инициализации массива? - PullRequest
7 голосов
/ 09 апреля 2011
class A {
public:
   A();

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

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

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

Ответы [ 2 ]

18 голосов
/ 09 апреля 2011

Единственная разумная вещь, которую вы можете сделать с 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 будет нулевым.

3 голосов
/ 09 апреля 2011

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

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

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<int[5]>& i) // or whatever the T should be
      : x{i} // or x(i)
        {}
}
A a({1,2,3,4,5)};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...