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

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

Размещение объектов

Как отмечалось, можно выделить память для любого типа данных. Сюда включаются и объекты. Например, в следующей программе выделяет память для объекта типа three_d:

#include <iostream.h>
#include <except.h>
class three_d {
public:
int x, y, z; // трехмерные координаты
three_d(int a, int b, int c);
~three_d() {cout « "Destructing\n";}
};
three_d::three_d (int a, int b, int c)
{
cout << "Constructing\n";
x = a;
y = b;
z = с;
}
// вывод координат X, Y, Z (оператор вставки для three_d)
ostream &operator<<(ostream &stream, three_d &obj)
{
stream << obj.x << ", ";
stream << obj.у << ", ";
stream << obj.z << "\n";
return stream; // возврат потока
}
int main()
{
three_d *p;
try {
p = new three_d (5, 6, 7);
} catch(xalloc xa) {
cout << "Allocation failure.\n";
return 1;
}
cout << *p;
delete p;
return 0;
}

Надо обратить внимание, что эта программа использует функцию вставки для вывода значений координат. Когда эта программа запускается, видно, что конструктор класса three_d вызывается в момент достижения строки, где стоит оператор new, а деструктор вызывается по достижении оператора delete. Заметим также, что инициализирующие значения автоматически передаются конструктору оператором new.

Ниже приведен пример, в котором размещается массив объектов типа three_d:

#include <iostream.h>
#include <except.h>
class three_d {
public:
int x, y, z; // трехмерные координаты
three_d(int a, int b, int c);
three_d() {cout << "Constructing\n";} // необходимо для массивов
~three_d() {cout << "Destructing\n";}
};
three_d::three_d (int a, int b, int c)
{
cout << "Constructing\n";
x = a;
у = b;
z = с;
}
// вывод координат X, Y, Z (оператор вставки для three_d)
ostream &operator<<(ostream &stream, three_d &obj)
{
stream << obj.x <<", ";
stream << obj.у << ", ";
stream << obj.z << "\n";
return stream; // возврат потока
}
int main ()
{
three_d *p;
int i;
try {
p = new three_d [10];
} catch (xalloc xa) {
cout << "Allocation failure.\n";
return 1;
}
for(i=0; i<10; i++) {
p[i].x = 1;
p[i].y = 2;
p[i].z = 3;
}
for (i=0; i<10; i++) cout << *p;
delete [] p;
return 0;
}

Обратим внимание, что к классу three_d добавлен второй конструктор. Поскольку размещен­ный массив не может быть инициализирован, то требуется конструктор без параметров. Если такой конструктор не будет определен, то компилятор выдаст сообщение об ошибке.