Автоматические преобразования типов объектов


С++ выполняет автоматическое преобразование базовых типов данных для выполнения преобразований вида: «базовый тип ßàкласс пользователя» или « класс пользователя ßà класс пользователя» надо рассматривать методы, которые применяет компилятор.

Пусть имеется класс 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, для случая, когда имеется конструктор с одним аргументом типа Тип) когда:

  1. в вызовах функций, методов передаются аргументы типа Тип, а объявлен класс Класс
  2. когда присваивается значение типа Тип переменной типа Класс
  3. когда return оператор использует выражение типа Тип, а надо вернуть результат типа Класс
  4. когда в вышеперечисленных ситуациях используется встроенный тип, который однозначно преобразуется в типТип.

 

Пример

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; просмотров: 1775;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.