Программирование на C и C++

Онлайн справочник программиста на C и C++

Создание инициализированных и неинициализированных массивов

Если создаются как инициализированные, так и неинициализированные массивы объектов, то возникает особая ситуация. Рассмотрим следующий класс:

class cl {
int i;
public:
cl(int j ) {i=j;}
int get_i() {return i;}
};

Здесь конструктор требует один аргумент. В результате объявления любого массива элементов данного класса требуется, чтобы эти элементы были инициализированы. Следующее объявление массива является ошибочным:

cl а[9]; // ошибка, конструктор требует инициализатор

Причина, по которой это объявление неверно, связана с тем, что подобное объявление требует наличия конструктора без параметров, поскольку оно не содержит инициализации. Так как класс cl не имеет конструктора без параметров, то компилятор выдает сообщение об ошибке. Для того, чтобы решить эту проблему, необходимо перегрузить конструктор, добавив еще один — без пара­метров. В таком случае оба типа массивов — с инициализированными и неинициализированны­ми элементами — становятся допустимыми. В качестве примера ниже приведена усовершенствованная версия объявления класса cl:

class cl {
int i;
public:
cl() {i=0;} // вызывается для неинициализированных массивов
cl(int j) {i=j;} // вызывается для инициализированных массивов
int get_i() {return i;}
};

Для объявленного таким образом класса оба следующих объявления являются допустимыми:

cl a1[3] = {3, 5, 6}; // инициализированный
cl а2[34]; // неинициализированный