Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Марченко А.Л. -> "С++ бархатный путь " -> 80

С++ бархатный путь - Марченко А.Л.

Марченко А.Л. С++ бархатный путь — М.: Горячая линия - Телеком, 2005. — 399 c.
ISBN 5-93517-056-6
Скачать (прямая ссылка): barhatniyput2005.djvu
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 152 >> Следующая

CoeplexTyp* CDv4(ComplexType(10));
ComplexType CDw4(10);
А оператор присвоения CDmS «* 25;
принимает следующий вид;
CDwS « ComplexType(25);
В резупьтате выполнения выражения явного преобразования вызывается конструктор преобразований, который создаёт временный безымянный объект, значение которого посредством операции присваивания (у каждого класса она своя) присваивается объекту CDw1. Поспе этого временный объект уничтожается. Всё очень просто и красиво.
Таким образом, проблема преобразования значения к типу, соответствующему данному классу (к производному типу) разрешается поспе определения конструктора преобразования. Преобразование значения производного типа (типа, соотвветствующего данному классу) к основному типу обеспечивается специальными функциями приведения или преобразующими функциями.
Объявление этих функций отличается характерным синтаксисом. Перечислим основные особенности синтаксиса этих функций
И функции приведения не имеют спецификатора возвращаемого значения:
¦ объявление функции приведения начинается с ключевого слова operator;
205
¦ функции приведения всегда объявляются с пустым списком параметров.
Несмотря на перечисленные особенности, синтаксис объявления функций приведения не является исключением из общей системы синтаксических правил языка C++. Следующее множество форм Бэкуса-Наура подтверждает это.
Объявление : :« ОггределенивФункции
Определ«ни«*унжции :
і СттисокСлецификатороаОбъяаления ] Описатель ,гс ЪогИющиализ а тор ] Та-яофункыии
: : <» Описатель ТелоФункции
: : - Описатель (СхекаОб-мдлеиияПараиатроветров) ТелоФункции ;:« Описатель (/СхеыаОбъяялакияПараметров1 !..,!) ТелоФункции :ИияОпмсаталу () Тало»ункции :Имя () Тало+уикнии
: : — Ижявумжциядрив едения {) Тало*ункции
:ш *****
И ещё несколько форм, посвященных нетерминалу ИмяФункции-Приведения:
Ижя»ункцииПриведения ;operator ИнжПриведбииогоТипа Имя ПривалftиногоТипа ;
СписокСпацификаторовТипа /рЬгОперацияj
СгшсокСпацификаторовТипа ::• СпецификаторТип»
/'СписокСпацификатороаТипа ]
Наконец,
Объявление :
operator СпецификаторТипа
/СгжсокСпииіикаторовТипа I /рЬгОпсрация /;
operator
СпяцифккаторТипа
!СписокСпецийикаторовТипа! !ptrOnapauwaТелоФункции
Таков синтаксис объявления и определения функций приведения. Мы объявляем функцию приведения к типу double непосредственно в теле нашего класса ComplexType (при этом выбор алгоритма преобразования остаётся личным делом программиста):
class ComplexType
(
operator doublet)
t
206
return ішад;
I;
) ;
Объявляем переменную z и объект CDw6: double г;
ComplexType CDw6(1,255);
После этого следующие операторы присвоения оказываются эквивалентными в деле присвоения переменной г значения мнимой части объекта CDw6.
г - CDw6.operator double();
/* operator double - имя функции приведении */ z * CDw€; z “ double(CDwfi); z » (double)CDw6;
Наличие в классе подобной функции приведения придаёт смысл условным операторам вида
і Г (СошрІеасіГуреО) {/* */)
if (ComplexType() >3.14) {/* */)
Проблемы включения подобных выражений ранее уже обсуждались нами в разделе, посвящённом основным свойствам конструкторов. Явным образом объявленной в классе функции приведения к одному из основных типов вполне достаточно для того, чтобы транслятор самостоятельно обеспечил преобразование типа, в результате которого появилась бы возможность для определения соответствующего преобразованного значения порождаемого объекта
На очереди функции приведения из класса в класс. Нам потребуется объявить ещё один класс. Мы объявим класс с максимально простой структурой;
class rrr
{
public: double a,b;
);
А вот как будет выглядеть конструктор приведения к типу ПТ для класса ComplexType (мы сознательно опускаем детали его реализации):
ComplexType (const rrrі rVal)
<
/*...*/
1
При объявлении параметра мы используем ссылку на объект. Здесь можно было бы организовать передачу параметров по значению. Но пере-
W
дача параметра по ссылке всегда предпочтительнее передачи параметра по значению.
Построим функцию приведения из класса ComplexType в класс пт. По традиции, это будет встроенная функция. Конечно же. что и как преобразовывать - личное дело каждого.
class ComplexType
1
operator rrr{)
(
rrr temp; temp. a •> real tamp. Id = imag; return temp;
/* Функция приведения - ато acft-vam функция! */
);
ь-
Мы определяем переменную - представитель класса пт.
rrr v;
После чего наблюдается полная эквивалентность тройки операторов:
v * CDt»6. operator rrr О; v » (rrr)CD»6; v — ггг(СОмб);
А главное, что функция приведения и такой оператор делает эквивалентным предыдущей тройке операторов:
v = CDw6;
И здесь нет ничего удивительного, поскольку в C++ допускается неявное преобразование типов. Операторные функции преобразования всего лишь позволяет расширить диапазон типов, над которыми можно осуществлять это самое неявное преобразование. Достаточно определить алгоритм преобразования и представить его в виде операторной функции. Всё остальное транслятор способен проделать самостоятельно!
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 152 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.