display_mode[0].set_res(low);

 display_mode[0].set_dim(640, 480);

 display_mode[1].set_res(medium);

 display_mode[1].set_dim(800, 600);

 display_mode[2].set_res(high);

 display_mode[2].set_dim(1600, 1200);

 cout << "Возможные режимы отображения данных:\n\n";

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

  cout << names[display_mode[i].get_res()] << ":";

  display_mode[i].get_dim(w, h);

  cout << w << " x " << h << "\n";

 }

 return 0;

}

При выполнении эта программа генерирует такие результаты.

Возможные режимы отображения данных:

низкий: 640 х 480

средний: 800 х 600

высокий: 1600 х 1200

Обратите внимание на использование двумерного символьного массива names для преобразования перечислимого значения в эквивалентную символьную строку. Во всех перечислениях, которые не содержат явно заданной инициализации, первая константа имеет значение 0, вторая — значение 1 и т.д. Следовательно, значение, возвращаемое функцией get_res(), можно использовать для индексации массива names, что позволяет вывести на экран соответствующее название режима отображения.

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

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

Если класс включает параметризованный конструктор, то массив объектов такого класса можно инициализировать. Например, в следующей программе используется параметризованный класс samp и инициализируемый массив sampArray объектов этого класса.

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

#include

using namespace std;

class samp {

  int a;

 public:

  samp(int n) { a = n; }

  int get_a() { return a; }

};

int main()

{

 samp sampArray[4] = { -1, -2, -3, -4 };

 int i;

 for(i=0; i<4; i++) cout << sampArray[i].get_a() << ' ';

 cout << "\n";

 return 0;

}

Результаты выполнения этой программы

-1 -2 -3 -4

подтверждают, что конструктору samp действительно были переданы значения от -1 до -4.

В действительности синтаксис инициализации массива, выраженный строкой

samp sampArray[4] = { -1, -2, -3, -4 };

представляет собой сокращенный вариант следующего (более длинного) формата:

samp sampArray[4] = { samp(-1), samp(-2), samp(-3), samp(-4) };

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

#include

using namespace std;

class samp {

  int a, b;

 public:

  samp(int n, int m) { a = n; b = m; }

  int get_a() { return a; }

  int get_b() { return b; }

};

int main()

{

 samp sampArray[4][2] = {

  samp(1, 2),

  samp(3, 4),

  samp(5, 6),

  samp(7, 8),

  samp(9, 10),

  samp(11, 12),

  samp(13, 14),

  samp(15, 16)

 };

 int i;

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

  cout << sampArray[i][0].get_a() << ' ';

  cout << sampArray[i][0].get_b() << "\n";

  cout << sampArray[i][1].get_a() << ' ';

  cout << sampArray[i][1].get_b() << "\n";

 }

 cout << "\n";

 return 0;

}

В этом примере конструктор класса samp принимает два аргумента. В функции main() объявляется и инициализируется массив sampArray путем непосредственных вызовов конструктора samp(). Инициализируя массивы, можно всегда использовать длинный формат инициализации, даже если объект принимает только один аргумент (короткая форма просто более удобна для применения). Нетрудно проверить, что при выполнении эта программа отображает такие результаты.

1 2

3 4

5 6

7 8

9 10

11 12

13 14

15 16

Указатели на объекты
Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги