Преклапање оператора за конверзију типа (cast)

Преклапање cast оператора представља други начин за конверзију корисничких типова (класа). Први начин конверзије корисничких типова је помоћу конструктора конверзије. Операторска функција за конверзију у тип T је operator T(). T може да буде стандардни, изведени (нпр. показивач) или класни тип. Функција за конверзију мора да буде члан класе из које се врши конверзија. Тип резултата функције не сме да буде наведен у дефиницији него се подразумева на основу имена функције. Функција нема аргументе (унарни оператор, члан класе).
Функција за конверзију објекта t типа T у тип U, T::operator U() може да се позива:
– као друге функције чланови: t.operator U()
– као cast оператор: (U)t
– као обична функција U(t), што је нотацијски исто као да је у питању конструктор U.
За разлику од конструктора U(t), преклопљени оператор U(t) може да се користи и за U које је стандардни тип.

Пример:
int(x) – конвертује x типа X у тип int.
Трећи облик нотације не може да се користи за типове са већим бројем речи.

Пример:
(unsigned long) x није исто што и unsigned long(x).
Конверзија се примењује аутоматски, ако је једнозначан избор конверзије. Ако су дефинисане обе конверзије U(t) и T(u), преводилац не може аутоматски да одреди конверзију за u+t.

Написати програм који ће илустровати конверзију типова.

#include<cmath>
 #include<iostream>
 using namespace std;
 class Kompl
 {
      double re,im;
 public:
      Kompl(double r=0,double i=0) { re=r;im=i; }
      operator double() { return sqrt(re*re+im*im); }
      friend double real (Kompl z){return z.re;}
      friend double imag (Kompl z){return z.im;}
      Kompl operator+ (Kompl z) { z.re+=re;z.im+=im;return z; }
      friend ostream & operator<< (ostream &it,const Kompl &z)
      { return it<<'('<<z.re<<','<<z.im<<')'; }
 };
 int main()
 {
      Kompl a(1,2);            cout<<"a="<<a<<endl;
      Kompl b=a;               cout<<"b="<<b<<endl;
      Kompl c=5;               cout<<"c="<<c<<endl;
                               cout<<"a+b="<<a+b<<endl;
                               cout<<"a+3="<<a+(Kompl)3<<endl;
                               cout<<"|a|+3="<<(double)a+3<<endl;
                               cout<<"a+(3,4)="<<a+Kompl(3,4)<<endl;
                               cout<<"double(a)="<<(double)a<<endl;
      double d=Kompl(3,4);     cout<<"d="<<d<<endl;
 }

Конструктор Kompl(double=0,double=0) представља и подразумевани конструктор и конструктор конверзије типа double у тип Kompl. Резултат конверзије је комплексан број чији је реалан део једнак конвертованом податку типа double а имагинарни део једнак је 0.
За конверзију комплексних бројева у реалне бројеве користи се операторска функција operator double(). У нашем примеру резултат конверзије је апсолутна вредност конвертованог комплексног броја.
Пошто су дефинисане конверзије типа између комплексних и реалних бројева у оба смера за израз a+3 не би било јасно да ли треба да буде реалан или комплексан. Ако резултат треба да буде комплексан број треба писати a+(Kompl)3 или a+Kompl(3). Ако резултат треба да буде реалан број потребно је писати: (double)a+3 или double(a)+3. У наредби Kompl z=double(a)+3; реалан резултат би се тек при додели вредности претварао у еквивалентан комплексан број, применом конструктора Kompl(double).

делови текста преузети са: Preklapanje operatora

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s