С++ для начинающих




Объектный подход - часть 8


  // инициализация элементов массива

  for (int ix=0; ix<_size; ++ix)

    ia[ix] = array[ix];

}

Третий конструктор называется копирующим конструктором. Он инициализирует один объект типа IntArray значением другого объекта IntArray. Такой конструктор вызывается автоматически при выполнении следующих инструкций:

IntArray array;

// следующие два объявления совершенно эквивалентны:

IntArray ia1 = array;

IntArray ia2 (array);

Вот как выглядит реализация копирующего конструктора для IntArray, опять-таки без обработки ошибок:

IntArray::IntArray (const IntArray &rhs )

{

  // инициализация членов данных

  _size = rhs._size;

  ia = new int[_size];

  // инициализация элементов массива

  for (int ix=0; ix<_size; ++ix)

    ia[ix] = rhs.ia[ix];

}

В этом примере мы видим еще один составной тип данных – ссылку на объект, которая обозначается символом &. Ссылку можно рассматривать как разновидность указателя: она также позволяет косвенно обращаться к объекту. Однако синтаксис их использования различается: для доступа к члену объекта, на который у нас есть ссылка, следует использовать точку, а не стрелку; следовательно, мы пишем rhs._size, а не rhs->_size. (Ссылки рассматриваются в разделе 3.6.)

Заметим, что реализация всех трех конструкторов очень похожа. Если один и тот же код повторяется в разных местах, желательно вынести его в отдельную функцию. Это облегчает и дальнейшую модификацию кода, и чтение программы. Вот как можно модернизировать наши конструкторы, если выделить повторяющийся код в отдельную функцию init():

class IntArray {

public:

  explicit IntArray (int sz = DefaultArraySize);

  IntArray (int *array, int array_size);

  IntArray (const IntArray &rhs);

  // ...

private:

  void init (int sz,int *array);

  // ...

};

// функция, используемая всеми конструкторами

void IntArray::init (int sz,int *array)

{

  _size = sz;

  ia = new int[_size];

  for (int ix=0; ix<_size; ++ix)

    if ( !array )

      ia[ix] = 0;




Содержание  Назад  Вперед