Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_05_INLINE_STATIC_CONST.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
123.39 Кб
Скачать

Массивы объектов класса

Из объектов класса, как и из обычных переменных, можно строить массивы. Синтаксис объявления массива объектов аналогичен синтаксису объявления массивов обычных переменных. Например, следующее объявление создает массив из 10 элементов, которые являются объектами класса AnyClass:

AnyClass obArr[10];

Однако для того, чтобы компилятор смог создать этот массив, он должен использовать конструктор по умолчанию объектов класса. В отношении конструктора по умолчанию действуют перечисленные нами ранее правила. Рекомендуем не полагаться на то, что компилятор сам создаст конструктор по умолчанию, и всегда при объявлении массива объектов некоторого класса включать в этот класс конструктор по умолчанию.

Доступ к элементам массива также аналогичен доступу к массивам переменных любого другого типа. Например:

#include <iostream.h>

class AnyClass

{

int a;

public:

AnyClass(int n){a=n;}

int GetA(){return a;}

};

int main()

{

//Объявление и инициализация массива объектов

AnyClass obArr[5]={13, 17, 21, 23, 27};

int i;

for(i=0;i<5;i++)

{

//Обращение к элементам массива

cout<<obArr[i].GetA()<<' ';

}

}

Эта программа выводит на экран проинициализированные значения массива объектов obArr. Фактически, примененный здесь синтаксис инициализации массива является сокращенной формой следующей конструкции:

AnyClass obArr[5] = {AnyClass(13), AnyClass(17), AnyClass(21),

AnyClass(23), AnyClass(27)};

К сожалению, ею можно воспользоваться только при инициализации массивов объектов, конструктор которых содержит только один параметр. При инициализации массивов объектов с конструктором, содержащим несколько параметров, приходится использовать полную (или длинную) форму конструкции.

В следующем примере создается двумерный массив объектов, конструктор которого содержит два параметра.

#include <iostream.h>

class Coord

{

int x, у;

public:

Coord(int X, int Y){x=X; у=Y;}

int GetX(){return x;}

int GetY(){return y;}

};

int main()

{

Coord coordArr[4][2] ={Coord(3,4), Coord(5,6),

Coord(7,8), Coord(9,10),

Coord(ll,12), Coord(13,14),

Coord(15,16), Coord(17,18)};

int i, j;

for(i=0; i<4;i++)

{

for(j=0; j<2; j++)

{

cout<<coordArr[i][j].GetX()<<' ';

cout<<coordArr[i][j].GetY()<<' ';

}

cout<<endl;

}

}

Использование указателей для доступа к объектам массива совершенно аналогично их использованию для обычных переменных и структур. Арифметика указателей также аналогична. Инкрементирование указателя приводит к тому, что он указывает на следующий объект массива, декрементирование − к тому, что он указывает на предыдущий объект массива. Рассмотрим пример:

#include <iostream.h>

class Coord

{

int x, у;

public:

Coord(int X, int Y){x=X; у=Y;}

int GetX(){return x;}

int GetY(){return y;}

}

int main()

{

Coord obArr[4][2]={Coord(3,4), Coord(5,6),

Coord(7,8), Coord(9,10),

Coord(11,12), Coord(13,14),

Coord(15,16), Coord(17,18)};

int i;

Coord *ptr;

ptr=obArr; //Инициализация указателя адресом массива

for(i=0; i<4; i++)

{

cout<<ptr->GetX()<<' ';

cout<<ptr->GetY()<<"\n";

ptr++; //Переход на следующий объект

}

}

Эта программа выводит на экран в каждой строке значения переменных х и у текущего элемента массива объектов.

Массивы объектов классов могут располагаться в куче. Например:

#include <iostream.h>

class Coord

{

int x, у;

public:

Coord(int X, int Y){x=X; у=Y;}

Coord(){x=0; у=0;}

int GetX() {return x;}

int GetY() {return y;}

};

int main()

{

int i;

Coord *ptr;

ptr = new Coord[6]; //Создание массива объектов в куче

for (i=0; i<6; i++ )

{

cout<<ptr->GetX()<<' ';

cout<<ptr->GetY()<<"\n";

ptr++ ; //Переход на следующий объект

}

cout<<"\n";

delete[] ptr; //Удаление массива объектов из кучи

}

Следует обратить внимание, что для удаления массива объектов используется форма оператора delete с квадратными скобками.

12