Главная->Інформатика та програмування->Содержание->Конструктор копирования по умолчанию

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 6) онлайн

Конструктор копирования по умолчанию

Мы рассмотрели два способа инициализации объектов. Конструктор без аргумен- тов может инициализировать поля объекта константными значениями, а конст- руктор, имеющий хотя бы один аргумент, может инициализировать поля значе- ниями, переданными ему в качестве аргументов. Теперь мы рассмотрим третий способ инициализации объекта, использующий значения полей уже существу- ющего объекта. К вашему возможному удивлению, для этого не нужно самим соз- давать специальный конструктор, поскольку такой конструктор предоставляет- ся компилятором для каждого создаваемого класса и называется копирующим конструктором по умолчанию. Копирующий конструктор имеет единственный аргумент, являющийся объектом того же класса, что и конструктор. Програм- ма ECOPYCON демонстрирует использование копирующего конструктора по умол- чанию:

// ecopycon.cpp

// инициализация объектов с помощью копирующего конструктора #include <iostream> using namespace std; ////////////////////////////////////////////////////////// class Distance    // длина в английской системе

{

  private:

    int feet;

    float inches;

  public:

    // конструктор без аргументов

    Distance() : feet(0), inches(0.0)

      { }

    // конструктора с одним аргументом нет!

    // конструктор с двумя аргументами

    Distance(int ft, float in) : feet(ft), inches(in)

      { }

    void getdist()           // ввод длины пользователем

    {

      cout << "\nВведите число футов "; cin >> feet;

      cout << "Введите число дюймов: "; cin >> inches;

    }

    void showdist()          // вывод длины

      { cout << feet << "\'-" << inches << '\"'; }

};

//////////////////////////////////////////////////////////

int main()

{

  Distance dist1(11, 6.25);  // конструктор с двумя аргументами

  Distance dist2(dist1);     // два конструктора с одним аргументом

  Distance dist3 = dist1;

  // вывод всех длин

  cout <<"\ndist1 = "; dist1.showdist();

  cout <<"\ndist2 = "; dist2.showdist();

  cout <<"\ndist3 = "; dist3.showdist();

  cout << endl;

  return 0;

}

 

Мы инициализировали объект dist1 значением 11'-6.25" при помощи конст- руктора с двумя аргументами. Затем мы определяем еще два объекта класса Distance с именами dist2 и dist3, оба из которых инициализируются значением объекта dist1. Возможно, вам покажется, что в данном случае должен был вы- зваться конструктор с одним аргументом, но поскольку аргументом являлся объект того же класса, что и инициализируемые объекты, были предприняты иные действия. В обоих случаях был вызван копирующий конструктор по умол- чанию. Объект dist2 инициализирован при помощи оператора

Distance dist2(dist1);

Действие копирующего конструктора по умолчанию сводится к копирова- нию значений полей объекта dist1 в соответствующие поля объекта dist2. Как это ни удивительно, но идентичные действия для пары объектов dist1 и dist3 вы- полняются при помощи оператора

Distance dist3 = dist1;

Можно подумать, что данный оператор выполняет операцию присваивания, но это не так. Здесь, как и в предыдущем случае, вызывается конструктор копи- рования по умолчанию. Оба оператора выполняют одинаковые действия и рав-

ноправны в использовании. Результат работы программы выглядит следующим образом:

dist1 = 11'-6.25" dist2 = 11'-6.25" dist3 = 11'-6.25"

Видим, что объекты dist2 и dist3 действительно имеют те же значения, что и объект dist1. В главе 11 «Виртуальные функции» мы расскажем, каким образом можно создать свой собственный копирующий конструктор с помощью пере- грузки копирующего конструктора по умолчанию.

 

16