Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1.44 Mб
Скачать

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

Можно создавать массивы объектов точно так же, как создаются массивы данных других типов. Например, следующая программа создает класс display, содержащий информацию о различных адаптерах дисплеев, которые могут быть подключены к ПК. В частности, он содержит число цве­тов, которые могут быть получены, и тип видеоадаптера. В функции main() создается массив из трех объектов display. Доступ к элементам этого массива осуществляется с помощью обычной процедуры с использованием индексов.

#include <iostream.h>

enum disp_type {mono, cga, ega, vga};

class display

{

int colors; // число цветов

enum disp_type dt; // тип дисплея

public:

void set_colors(int num) { colors = num; }

int get_colors() { return colors; }

void set_type(enum disp_type t) { dt = t; }

enum disp_type get_type() { return dt; }

};

char names[4][5] = {"mono", "cga", "ega", "vga"};

int main()

{

display monitors[3];

int i;

monitors[0].set_type(mono); monitors[0].set_colors(1);

monitors[1].set_type(cga); monitors[1].set_colors(4);

monitors[2].set_type(ega); monitors[2].set_colors(16);

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

{

cout << names[monitors[i].get_type()] << “ “;

cout << "has " << monitors[i].get_colors();

cout << " colors" << "\n";

}

return 0;

}

Эта программа выводит на экран следующий текст:

mono has 1 colors

cga has 4 colors

ega has 16 colors

Хотя это и не относится специально к массивам объектов, обратим внимание, каким образом двумерный символьный массив names использован для преобразования перечисляемых значений к их строковым эквивалентам. Для всех переменных перечисляемого типа, не содержащих явной инициализации, первая константа имеет значение 0, вторая 1 и т. д. Поэтому возвращаемое фун­кцией get_type() значение может быть использовано для индексации массива names, что позволя­ет вывести подходящее имя.

Многомерные массивы объектов индексируются в точности так же, как и массивы любых дру­гих типов данных.

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

Если класс определяет конструктор с параметрами, то можно инициализировать каждый объект массива путем указания списка инициализации в точности так, как это делается для массивов других типов. Однако точная форма списка инициализации будет определяться числом парамет­ров конструктора. Для объектов, чьи конструкторы имеют только один параметр, можно просто указать список начальных значений, используя обычный синтаксис инициализации массивов. Каждое значение в списке по порядку передается конструктору элемента в массиве при его создании. Например, ниже приведена программа, инициализирующая массив:

#include <iostream.h>

class C

{

int i;

public:

C(int j) { i=j; } // конструктор

int get_i() { return i; }

};

int main()

{

C ob[3] = {1, 2, 3}; // инициализаторы

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

cout << ob[i].get_i() << "\n";

return 0;

}

Эта программа выводит на экран числа 1, 2 и 3.

Если конструктор объекта требует два или большее число аргументов, тогда необходимо ис­пользовать слегка измененную форму инициализации, приведенную ниже:

#include <iostream.h>

class pair

{

int h;

int i;

public:

pair(int j, int k) { h=j; i=k; } // конструктор

int get_i() { return i; }

int get_h() { return h; }

};

int main()

{

pair p[3] = { pair(1,2), pair(3,4), pair(5,6) }; // инициализаторы

for(int i=0; i<3; i++)

{

cout << p[i].get_h() << " ";

cout << p[i].get_i() << "\n";

}

return 0;

}

В этом примере конструктор класса C имеет два параметра и поэтому требует два аргумента. В результате инициализация в укороченной форме записи не может использоваться. Вместо этого применяется инициализация в длинной форме, как показано в примере. Разумеется, можно ис­пользовать эту длинную форму инициализации во всех случаях.