Функции преобразования. Пример
Специальная операторная функция С++, которую надо применять так же как и обычные формы приведения типов.
Пример.
Stonewt wolf(287.4);
doule host = double (wolf);
или
double thinker = (double) wolf;
В 2-х последовательных выражениях компилятор будет проверять имеется ли в классе специальное операторное объявление функции, обладающее следующими особенностями:
- быть методом класса
- не задавать возвращаемый тип значения (тип возвращаемого значения в этом случае совпадает с именем)
- не иметь аргументов (неявно аргументом является сам объект)
Доопределим класс 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; просмотров: 2297;