Podstawy informatyki Operatory rzutowania Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
Operatory rzutowania int main() { double d=2.5; int i; i=d; cout << d << endl << i << endl; return 0; } conversion from 'double' to 'int', possible loss of data 2.5 2
Operatory rzutowania int main() { double d=2.5; int i; i=(int)d;// lub i=int(d) cout << d << endl << i << endl; return 0; } 2.5 2
Operatory rzutowania int main() { int i=65; char c; c=(char)i; cout << i << endl << c << endl; return 0; } 65 A
Nowe operatory rzutowania 1.Stare operatory rzutowania: –(nazwa_typu)wyrażenie –nazwa_typu (wyrażenie) 2.Nowe operatory rzutowania: –static_cast (wyrażenie) –const_cast (wyrażenie) –dynamic_cast (wyrażenie) –reinterpret_cast (wyrażenie)
static_cast Operator static_cast jest używany do wszystkich konwersji, które są dobrze zdefiniowane i mogą być wykonane przez kompilator (mogą powodować ostrzeżenia), np.: –konwersje roszerzające (np. int -> float, int -> long), –konwersje zawężające (utrata informacji, np. float -> int),
static_cast int main() { double d=3.14; int i; i=static_cast (d); cout << d << endl << i << endl; return 0; }
const_cast Używany do konwersji typu: –const -> non-const –volatile -> non-volatile Używany TYLKO do konwersji tego typu – jeżeli równocześnie konieczna jest inna konwersja, musi być ona wykonana za pomocą oddzielnego operatora. Nie może być użyty do bezpośredniej konwersji obiektu const na non-const.
const_cast int main() { const int a=2; const int *st_w=&a; int *zm_w; cout<<a<<endl; zm_w=const_cast (st_w); *zm_w=-2; cout<<*zm_w<<endl; cout<<a<<endl; return 0; } 2 -2 ???
dynamic_cast dynamic_cast robi rzutowanie tylko pod warunkiem, że w danej konkretnej chwili ma to sens.
dynamic_cast class pojazd { protected: int l_kol, max_sp; public: pojazd(int a,int b):l_kol(a),max_sp(b){} virtual void wypisz(); }; class samochod: public pojazd { double poj_s; public: samochod(int a,int b,double c):pojazd(a,b), poj_s(c){} void wypisz(); }; class rower: public pojazd { int li_prze; public: rower(int a, int b, int c):pojazd(a,b), li_prze(c){} void wypisz(); }; int main() { pojazd P(2,30),*WP; samochod S(4,180,1.9),*WS; rower R(2,30,21); char a; cout<<"S czy R\n"; cin>>a; if (a=='S') WP=&S; else WP=&R; WS=dynamic_cast (WP); cout<<&S<<endl; cout<<WS<<endl; return 0; } S czy R S 0040F950 S czy R R 0040F
reinterpret_cast Jest to najmniej bezpieczny mechanizm rzutowania, mogący powodować błędy. Traktuje obiekty jak pewien zestaw bitów, nie zwraca uwagi na znaczenie.
reinterpret_cast int main() { int ti[]={1,2,3,4},*wi,*wt; double td[]={1.0,2.0,3.0,4.0},*wd; wi=ti; wd=td; for (int i=0;i<4;i++) cout<<*(wi+i)<<"\t"<<*(wd+i)<<endl; wt=wi; wi=reinterpret_cast (wd); wd=reinterpret_cast (wt); cout<<endl; for (int i=0;i<4;i++) cout<<*(wi+i)<<"\t\t"<<*(wd+i)<<endl; return 0; }
reinterpret_cast int main() { int *wi; cin>>wi; return 0; } int main() { int *wi,a; a= ; wi=reinterpret_cast (a); cout<<wi<<endl; cout<<oct<<a<<endl; return 0; }
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: