2.5. Список инициализации

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

Например:

      class Arr   // массив чисел с плавающей точкой

            {

                  int n;     // максимальное число элементов

                  double *p; // указатель на массив

            public:

                  Arr(int size, double *a): n(size), p(a) {}

            };

В данном примере список инициализации означает то же самое, что и присваивания n = size и p = a.

Преимущество списка инициализации заключается в том, что он позволяет задавать начальные значения констант и псевдонимов (ссылок).

Например:

      class Pair

            {

                  const int n;

                  int& adr;

            public:

                  Pair(int n, int a): n(n), adr(a) {}

            };

      void main()

            {

            int p = 10;

            Pair b(5, p); // в результате b.n = 5,  b.adr = 10

            }

В этом примере присваивания Pair::n = n; adr = a; — не допускаются.

Пример. Список инициализации и определение двумерного массива с помощью перегрузки операции скобок.

#include <conio.h>

#include <iostream.h>

// Класс — двумерный массив

class twomas

      {

      // Закрытые элементы

            int *p;                      // Массив

            const int m, n;   // Размерность массива

      public:     // Общедоступные элементы

            int& operator () (int i, int j)    // Перегрузка операции ()

                  {

                  return p[(i-1)*n + j — 1];

                  }

            twomas(int m0, int n0):m(m0), n(n0) // Конструктор

                  {

                  p = new int [m*n];      // Выделяем память под массив

                  }

      };

void main()

      {

      int i, j;   // Переменные для циклов

      twomas t(10, 15); // Создаём двумерный массив t размером 10×15

      clrscr();   // Очистка экрана

      cout<<"Содержимое двумерного массива:n";

      // Заполнение ячеек массива и вывод его содержимого на экран

      for (i=1; i<=10; i++)

            {

            for (j=1; j<=15; j++)

                  {

                  t(i, j) = 100*i+j;

                  cout<<‘ ‘<<t(i,j);

                  }

            cout<<‘n'; // Перевод строки

            }

      getch();    // Ожидание нажатия клавиши

      }

Результаты работы программы

Содержимое двумерного массива:

 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115

 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215

 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315

 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415

 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515

 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615

 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715

 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815

 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915

 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015