|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Перегрузка функций (методов класса). Создание и использование конструкторов копированияМетоды классов, так же как и обычные функции C++, можно перегружать. Перегрузка функций означает, что в текущей области действия одно и то же имя могут использовать несколько функций. Компилятор выбирает нужную функцию, учитывая количество и тип аргументов, использованных при ее вызове. Конструктор копирования по умолчанию Мы рассмотрели два способа инициализации объектов. Конструктор без аргументов может инициализировать поля объекта константными значениями, а конструктор, имеющий хотя бы один аргумент, может инициализировать поля значениями, переданными ему в качестве аргументов. Теперь мы рассмотрим третий способ инициализации объекта, использующий значения полей уже существующего объекта. Для этого не нужно самим создавать специальный конструктор, поскольку такой конструктор предоставляется компилятором для каждого создаваемого класса и называется копирующим конструктором по умолчанию. Копирующий конструктор имеет единственный аргумент, являющийся объектом того же класса, что и конструктор. #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; Можно подумать, что данный оператор выполняет операцию присваивания, но это не так. Здесь, как и в предыдущем случае, вызывается конструктор копирования по умолчанию. Оба оператора выполняют одинаковые действия и равноправны в использовании. Видим, что объекты dist2 и dist3 действительно имеют те же значения, что и объект dist1.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |