Как я могу использовать список инициализации члена для инициализации массива?
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-object
s, вы не сможете сделать это:
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)};