Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Неявное использование конструкторов преобразования




Помимо использования конструктора преобразования при явном создании объекта класса и инициализации его единственным значением другого типа, компилятор также вызывает соответствующий конструктор преобразования для преобразования переменной-члена какого-либо другого типа в объект класса. Другими словами, конструктор преобразования указывает компилятору, как преобразовывать объекты или переменные различных типов в объект данного класса. Например, два конструктора преобразования класса CCurrency позволят присвоить значение типа double или long существующему объекту этого класса.

CCurrency Bucks;Bucks = 29.95; Bucks = 35L;

И в первом, и во втором присваивании компилятор в первую очередь преобразовывает константу в объект класса CCurrency, используя соответствующий конструктор преобразования, а затем присваивает его объекту Bucks класса CCurrency. Символ L во втором операторе присваивания необходим для исключения неоднозначного вызова конструктора преобразования.

В следующем примере предположим, что функция имеет параметр типа CCurrency.

void Insert (CCurrency Dinero);

Так как для класса CCurrency определены оба конструктора преобразования, данной функции можно передать значение типа double или long, как объект класса CCurrency. Компилятор вызовет соответствующий конструктор для преобразования аргумента в объект класса CCurrency.

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

class CCurrency{ //... public: //... CCurrency operator+ (const CCurrency sCurr) { return CCurrency (Dollars + Curr.Dollars, Cents + Curr.Cents); } CCurrency operator+ (long Dol) { return CCurrency (Dollars + Dol, Cents); } friend CCurrency operator+ (long Dol, const CCurrency &Curr); //... };

Теперь, благодаря конструктору, преобразующему значения типа long в объекты класса CCurrency, можно исключить две функции operator + и переписать функцию, которая не является членом класса.

class CCurrency{ //... public: //... friend CCurrency operator+ (const CCurrency &Curr1, const CCurrency &Curr2); //... };CCurrency operator+ (const CCurrency &Curr1, const CCurrency &Curr2){ return CCurrency (Currl.Dollars + Curr2.Dollars, Currl.Cents + Curr2.Cents);}

Эта единственная функция-оператор может выполнять следующие операции сложения.

CCurrency Bucks1 (39, 95); CCurrency Bucks2 (149, 85); CCurrency Bucks3;Bucks3 = Bucks1 + Bucks2; Bucks3 = Bucks1 + 10L; Bucks3 = 15L + Bucks1;

Во втором и третьем выражениях компилятор сначала преобразовывает константу типа long в объект CCurrency, используя соответствующий конструктор преобразования, а затем вызывает дружественную функцию-оператор для сложения двух объектов.

Кроме того, так как теперь CCurrency имеет конструктор преобразования с параметром типа double, единственная функция-оператор может обрабатывать значения с плавающей запятой.

CCurrency Bucks1 (39, 95); CCurrency Bucks2 (149, 85); CCurrency Bucks3;Bucks3 = Bucksl + 29.51; Bucks3 = 87.64 + Bucks1;

В листингах 5.1 и 5.2 приведены окончательные версии классов CCurrency и CMessage, в том числе новые конструкторы копирования и преобразования.

Листинг 5.1

// CCurr.h: файл заголовков класса CCurrency#include <string.h>#include <iostream.h>class CCurrency{ private: long Dollars; int Cents; public: CCurrency () // конструктор по умолчанию { Dollars = Cents = 0; } CCurrency (long Dol, int Cen =0) // конструктор преобразования { SetAmount (Dol, Cen); } CCurrency (double DolAndCen) // конструктор преобразования { Dollars = long (DolAndCen); Cents = int ((DolAndCen - Dollars) * 100.0 + 0.5); } void GetAmount (long *PDol, int *PCen) { *PDol = Dollars; *PCen = Cents; } void PrintAmount () { cout.fill ('0'); cout.width (1); cout << '$' << Dollars << '.'; cout.width (2); cout << Cents << '\n'; } void SetAmount (long Dol, int Cen) { Dollars - Dol + Cen / 100; Cents = Cen % 100; } friend CCurrency operator+ (const CCurrency &Curr1, const CCurrency &Curr2); };CCurrency operator+ (const CCurrency &Curr1, const CCurrency &Curr2) { return CCurrency (Corrl.Dollars + Curr2.Dollars, Currl.Cents + Curr2.Cents); }

Листинг 5.2

// CMess.h: файл заголовков класса CMessage #include <string.h> #include <iostream.h>class CMessage{ private: char *Buffer; public: CMessage () // конструктор по умолчанию { Buffer = new char ('\0'); } CMessage (const CMessage &Message) // конструктор копирования { Buffer = new char [strlen (Message.Buffer) + 1]; strcpy (Buffer, Message.Buffer); } CMessage (const char *String) // конструктор преобразования { Buffer = new char [strlen (String) + 1]; strcpy (Buffer, String); } ~CMessage () { delete [] Buffer; } void Display () { cout << Buffer << '\n'; } void Set (char *String) { delete [] Buffer; Buffer = new char (strlen (String) + 1]; strcpy (Buffer, String); } CMessage & operator= (const CMessage &Message) { if (&Message = this) return *this; delete [] Buffer; Buffer = new char [strlen (Message.Buffer) + 1]; strcpy (Buffer, Message.Buffer); return *this; } };

Примечание

Конструкторы преобразования класса указывают компилятору, как преобразовать какой-либо тип данных в объект класса. Кроме того, можно написать функцию преобразования, предоставляющую компилятору способ преобразования объекта класса в данные какого-либо другого типа. Функция преобразования определяется как функция-член и подобна функции-оператору, используемой для перегрузки стандартных операторов. Однако функция преобразования менее универсальна, чем аналогичный конструктор, и должна быть тщательно продумана во избежание неопределенности.

 




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


Дата добавления: 2014-01-07; Просмотров: 324; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.