Автоматические преобразования типов объектов
С++ выполняет автоматическое преобразование базовых типов данных для выполнения преобразований вида: «базовый тип ßàкласс пользователя» или « класс пользователя ßà класс пользователя» надо рассматривать методы, которые применяет компилятор.
Пусть имеется класс 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.
Только конструктор с 1-м аргументом может быть использован как функция преобразования, с большим числом не может. |
Опыт использования С++ показал, что автоматическое преобразование данного типа не всегда желательно. Если надо блокировать автоматическое неявное преобразование, то надо указать в объявлении конструктора ключевое слово explict, т.е. указание о только явном использовании:
explict Stoneut(double lbs);//неявное преобразование не допускается
Пример
Stonewt myCat;
myCat = 19.6;//ошибка
myCat = Stonewt(19.6);//правильно, явное преобразование (если explict)
//другая синтаксически правильная форма
myCat = (Stonewt)19.6;
В общем случае попытка неявного преобразования к классу Класс делается (если не указано explict, для случая, когда имеется конструктор с одним аргументом типа Тип) когда:
- в вызовах функций, методов передаются аргументы типа Тип, а объявлен класс Класс
- когда присваивается значение типа Тип переменной типа Класс
- когда return оператор использует выражение типа Тип, а надо вернуть результат типа Класс
- когда в вышеперечисленных ситуациях используется встроенный тип, который однозначно преобразуется в типТип.
Пример
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);
Дата добавления: 2016-05-26; просмотров: 1913;