ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 «Виртуальные функции» мы расскажем, каким образом можно создать свой собственный копирующий конструктор с помощью пере- грузки копирующего конструктора по умолчанию.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Схожі підручники
- Легкий способ бросить курить
- Індивідуальна робота з курсу «Інвестування»
- Естетика . Підручник (частин 2)
- Реферат на тему « Особливості та недоліки оподаткування операцій з недержавного пенсійного забезпечення в Україні »
- Стан НПС та основні напрями природоохоронної політики Чехії управлінські, організаційні, економічні та юридичні аспекти
- Думай как миллионер (онлайн)
