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




Объектно-ориентированный подход - часть 7


    : IntArray( iar, sz ) {}

(Мы будем подробно говорить о конструкторах в главах 14 и 17. Там же мы покажем, почему не нужно реализовывать конструктор копирования для IntArrayRC.)

Часть определения, следующая за двоеточием, называется списком инициализации членов. Именно здесь, указав конструктор базового класса, мы можем передать ему параметры. Тела обоих конструкторов пусты, поскольку их работа состоит исключительно в передаче параметров конструктору базового класса. Нам не нужно реализовывать деструктор для IntArrayRC, так как ему просто нечего делать. Точно так же, как при создании объекта производного типа вызывается сначала конструктор базового типа, а затем производного, при уничтожении автоматически вызываются деструкторы – естественно, в обратном порядке: сначала деструктор производного, затем базового. Таким образом, деструктор базового класса будет вызван для объекта типа IntArrayRC, хотя тот и не имеет собственной аналогичной функции.

Мы поместим все встроенные функции класса IntArrayRC в тот же заголовочный файл IntArrayRC.h. Поскольку у нас нет невстроенных функций, то создавать файл IntArrayRC.C не нужно.

Вот пример простой программы, использующей классы IntArray и IntArrayRC:

#include <iostream>

#include "IntArray.h"

#include "IntArrayRC.h"

void swap( IntArray &ia, int ix, int jx )

{

  int tmp  = ia[ ix ];

  ia[ ix ] = ia[ jx ];

  ia[ jx ] = tmp;

}

int main()

{

  int array[ 4 ] = { 0, 1, 2, 3 };

  IntArray ia1( array, 4 );

  IntArrayRC ia2( array, 4 );

  // ошибка: должно быть size-1

  // не может быть выявлена объектом IntArray

  cout << "swap() with IntArray ia1" << endl;

  swap( ia1, 1, ia1.size() );

  // правильно: объект IntArrayRC "поймает" ошибку

  cout << "swap() with IntArrayRC ia2" << endl;

  swap( ia2, 1, ia2.size() );

  return 0;

}

При выполнении программа выдаст следующий результат:

 swap() with IntArray ia1




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