Выбрать главу

 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 <iostream>

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

Указатели на объекты

Как было показано в предыдущей главе, доступ к структуре можно получить напрямую или через указатель на эту структуру. Аналогично можно обращаться и к объекту: непосредственно (как во всех предыдущих примерах) или с помощью указателя на объект. Чтобы получить доступ к отдельному члену объекта исключительно "силами" самого объекта, используется оператор "точка". А если для этого служит указатель на этот объект, необходимо использовать оператор "стрелка". (Применение операторов "точка" и "стрелка" для объектов соответствует их применению для структур и объединений.)

Чтобы объявить указатель на объект, используется тот же синтаксис, как и в случае объявления указателей на значения других типов. В следующей программе создается простой класс Р_ехample, определяется объект этого класса ob и объявляется указатель на объект типа Р_ехample с именем р. В этом примере показано, как можно напрямую получить доступ к объекту ob и как использовать для этого указатель (в этом случае мы имеем дело с косвенным доступом).

// Простой пример использования указателя на объект.

#include <iostream>

using namespace std;

class P_example {

  int num;

 public:

  void set_num(int val) {num = val;}

  void show_num();

};

void P_example::show_num()