Констукторы и массивы объектов

Чтобы описать вектор объектов класса, имеющего конструктор, этот класс должен иметь конструктор, который может вызываться без списка параметров. Нельзя использовать даже параметры по умолчанию. Например:
table tblvec[10];

будет ошибкой, если нет конструктора без параметров так как для table::table(int sz=10) требуется целый параметр. Нет способа задать параметры конструктора в описании вектора. Чтобы можно было описывать вектор таблиц table, можно модифицировать описание table, например, так:

class table {
void init(int sz); // как старый конструктор
public:
table(int sz) { init(sz); } // как раньше, но без по умолчанию
table() { init(10); } // по умолчанию
};

Когда вектор уничтожается, деструктор должен вызываться для каждого элемента этого вектора. Для векторов, которые не были размещены с помощью new, это делается неявно. Однако для векторов в свободной памяти это не может быть сделано неявно, поскольку компилятор не может отличить указатель на один объект от указателя на первый элемент вектора объектов. Например:
void f() {
table* t1 = new table;
table* t2 = new table[10];
table* t3 = new table[10];
delete t1; // одна таблица
delete t2; // неприятность: 10 таблиц
delete[] t3;
}
Компилятор не может найти число элементов вектора из объема выделенной памяти, потому, что распределитель свободной памяти не является частью языка и может быть задан программистом.
Конструкторы могут инициализировать массивы объектов класса таким образом, как и массивы встроенных типов. Максимальное число элементов может быть опущенно, если оно равно числу инициализирующих значений. Если максимальное число элементов больше числа значений, то оставшиеся значения инициализируются при помощи конструктора по умолчанию. Если это не конструктор по умолчанию, то все же значения должны быть указаны. Если заданы все значения для данного размера массива, то фигурные скобки при указании списка значений могут быть опущены.

class Phone {
int a,b,c;
public:
Phone(int a1,int b1,int c1):a(a1),b(b1),c(c1) {}
};

Phone office[]= { // Компилятор вычислит размер за нас
900, 800, 905,
678,456,546 };
Phone office[3]= { // Требуетс конструктор по умолчанию, которого y Phone нет
890, 790,343,
238, 279, 564
};


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: