ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Автоматические преобразования типов объектовС++ выполняет автоматическое преобразование базовых типов данных для выполнения преобразований вида: «базовый тип ßàкласс пользователя» или «класс пользователя ßà класс пользователя» надо рассматривать методы, которые применяет компилятор. Пусть имеется класс Stoneut, содержащий представления веса в виде: (1) стоуны с фунтами и (2) в фунтах. В стоуне 14 фунтов:
class Stonewt { private: enum {Lb_per_stn = 14};//число фунтов в стоуне int stone;//стоуны double pds_left;//остаток, меньше 1 стоуна double pounds;//вес в фунтах public: …..//конструкторы и другие функции
Реализация класса будет следующей
Stonewt::Stonewt(double lbs)//конструктор на базе фунтов stone = int (lbs)/Lbs_per_stn; pds_left = lbs – stone*Lb_per_stn; pounds = lbs; } Stonewt::Stonewt(int stn, double lbs)//на базе стоунов и фунтов { stone = stn; pds_left = lbs; pounds = stn*Lbs_per_stn+lbs; Stonewt::Stonewt()//конструктор по умолчанию stone = pounds = pds_left = 0; } Stonewt::~Stonewt(){} //деструктор
Как реализовать преобразование целого и вещественного типа в тип Stonewt? – Это уже готово. Есть конструкторы. Имеем в программе
Stonewt myCat; ... myCat = 19.6;//допустимо
Используется 1-й из указанных конструкторов для создания временного объекта класса Stonewt из 19.6, а затем выполняется поэлементное копирование в поля объекта myCat.
Опыт использования С++ показал, что автоматическое преобразование данного типа не всегда желательно. Если надо блокировать автоматическое неявное преобразование, то надо указать в объявлении конструктора ключевое слово explict, т.е. указание о только явном использовании: explict Stoneut(double lbs);//неявное преобразование не допускается
Пример Stonewt myCat; myCat = 19.6;//ошибка myCat = Stonewt(19.6);//правильно, явное преобразование (если explict) //другая синтаксически правильная форма myCat = (Stonewt)19.6;
В общем случае попытка неявного преобразования к классу Класс делается (если не указано explict, для случая, когда имеется конструктор с одним аргументом типа Тип) когда:
Пример Stonewt Jumbo(7000); … Jumbo = 7300;
В 1-м случае 7000 преобразовывается в тип double, а потом вызывается конструктором объекта. Во 2-м случае 7300 преобразовывается в тип double, вызывается конструктор и создаётся временный объект класса Stonewt, а потом значения копируются в объект Jumbo. Пример. Пусть в классе объявлен конструктор с аргументом типа long. Тогда компилятор ждя предложенного примера отвергнет оба оператора из-за неоднозначного перевода int как и в long, так и в double, т.е. неясно какой конструктор вызывать.
Пример Если long не объявлен, то следующие 2 формы конструирования эквивалентны и могут использоваться наряду с предыдущей: Stonewt pavarotti(260); Stonewt pavarotti = Stonewt(260);
Не нашли, что искали? Воспользуйтесь поиском:
|