Функции преобразования. Пример


Специальная операторная функция С++, которую надо применять так же как и обычные формы приведения типов.

 

Пример.

 

Stonewt wolf(287.4);

doule host = double (wolf);

или

double thinker = (double) wolf;

 

В 2-х последовательных выражениях компилятор будет проверять имеется ли в классе специальное операторное объявление функции, обладающее следующими особенностями:

  1. быть методом класса
  2. не задавать возвращаемый тип значения (тип возвращаемого значения в этом случае совпадает с именем)
  3. не иметь аргументов (неявно аргументом является сам объект)

Доопределим класс Stonewt следующими специальными операторными функциями:

Stonewt::operator int() const

{

return int (pounds+0.5);

}

Stonewt::operator double() const

{

return pounds;
}

 

Пример

 

Stonewt poppins(9,2.8);//9 стоунов, 2.8 фунта

double p_wt = poppins; //правильно

long gone = poppins;//компилятор выдаст сообщение о неоднозначности: poppins à int или //poppins à double. Ключевое слово explict не работает с функциями преобразования

 

long gone = (double)poppins;//верно

long gone = (int)poppins;//верно

 

 

Для обеспечения надёжности программ лучше использовать явные преобразования. Например, operator int() можно заменить на следующий метод:

int Stonewt::Stone_to_Int()
{return int(pounds+0.5);}

 

В этом случае недопустим оператор:

int plb = poppins;

но работает преобразование:

int plb = poppins.Stone_to_Int();

 

Преобразование и дружественные типы данных

Пусть имеется класс Stonewt и к нему добавлено объявление дружественной функции:

 

Stonewt operator +(const Stonewt &st1, const Stonewt &st2)
{

double pds = st1.pounds+st2.pounds;

Stonewt sum(pds);

return sum;
}

 

Нет объявления функции преобразования operator double(), но мы располагаем конструктором с аргументом типа double.

 

Тогда следующие выражения имеют смысл:

 

Stonewt jennySt(9,12);

double pennyD = 146.0;

Stonewt total;

total = pennyD + jennySt;

 

Вычисления выполняются следующим образом. Определяется необходимость вызова дружественной функции operator+ и выражение преобразовывается к виду:

total = operator+(Stonewt(pennyD),jennySt);

 

Для этих же целей можно использовать перегрузку оператора +. Кроме того, в случае появления неопределённости можно давать несколько вариантов определений дружественных функций или элементов функций использующих полиморфизм именований.

В общем же неявное преобразование типов реализует ещё один вид полиморфизма – полиморфизм приведений.

 



Дата добавления: 2016-05-26; просмотров: 2176;


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

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

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

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