Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Konverziós operátorok
Az átdefiniálható operátorok külön családját képezik az ún. konverziós (cast) operátorok. Konverzió kijelölése: (céltípus) változó Értékadásban (ha két oldalon eltérő típus van) és függvényhíváskor (átadott objektum típusa a deklarációban megadottól eltér) automatikus típuskonverzió megy végbe. Implicit típuskonverzió.
2
Konverziós operátorok átdefiniálása
Példa: Két double koordinátát tartalmazó vektor objektumok és az MS_Windows-ban megszokott forma ( egy vektor egy long típusban kerül tárolásra úgy, hogy a long alsó helyiértékű 16 bitje az x, felső helyiértékű 16 bitje az y koordináta) között végzünk átalakításokat.
3
Típuskonverzió Vector vec ( 1.0, 2.5 ) ; long point = 14L + 36 L << 16 ) ; //14, 36 koordinátájú pont extern f (long) ; extern g (Vector) ; vec = (Vector ) point ; //explicit vec = point ; //implicit g (point ) ; //implicit point = (long ) vec ; //explicit point = vec ; //implicit f (vec ) ; //implicit
4
Konverziós operátorok átdefiniálása
Újdonság a C++-ban: osztállyal gyártott objektumokra is definiálhatunk átalakító operátorokat. Két eset: - osztállyal definiált típusról alakítunk át más típusra ( ami lehet más osztállyal definiált típus vagy beépített típus). - Beépített vagy osztállyal definiált típust konvertálunk osztállyal definiált típusra.
5
Konverzió osztállyal definiált típusról
A Vector -> típus (jelen esetben long) átalakítást kell megvalósítanunk, amely a Vector osztályban egy operator típus ( ) ; tagfüggvénnyel lehetséges. Ehhez a tagfüggvényhez nem lehet visszatérési típus és nem lehet argumentum sem.
6
Megvalósítás class Vector { double x, y ; public: operator long ( ) { return ((long) x + (long) y <<16 ) ; } }
7
Beépített vagy osztállyal definiált típust konvertálunk osztállyal definiált típusra
Amennyiben egy objektumot akarunk létrehozni egy más típusú változóból, olyan konstruktort kell készíteni, ami argumentumként a megadott típust fogadja el. A long -> Vector átalakításhoz tehát a Vector osztályban egy long argumentumú konstruktor szükséges:
8
Példa class Vector { double x, y ; public: Vector ( long lo) { x = lo & 0xffff; y = lo >>16 ; }
9
Szabványos I/O Az operátor átdefiniálás jellegzetes alkalmazása a C++ szabványos I/O könyvtára. Egy változó beolvasása cin >> változó //szabványos inputról Egy változó kiírása cout << változó //szabványos outputra cerr << változó //szabványos hibafájl
10
Cin és cout objektumok C könyvtári függvények: C++ átdefiniált operátorok #include <stdio.h> #include <iostream.h> main() { main() { int i; int i; i= 5; i = 5; printf (“Hi%d\n”, i); cout<<“Hi”<<i<<‘\n’; scanf (“%d”, &i); cin>>i; } } C++: amennyiben több változót akarunk kiírni vagy beolvasni, azok láncolhatók. Szabványos I/O C++ megoldása mögött a << és >> operátorok átdefiniálása áll.
11
Nézzük meg a cin és cout objektumok típusát meghatározó istream és ostream osztályokat, melyek az iostream.h deklarációs fájlban találhatók: class ostream { public: ostream& operator<<( int i); //lehetséges implementáció printf(“%d”, i); } ostream& operator<<( char *i); ostream& operator<<( char); } ; extern ostream cout;
12
istream osztály class istream { public: istream& operator>>( int& i); //lehetséges implementáció {scanf(“%d”, &i); } } ; extern istream cin;
13
Megoldás: - vagy az ostream osztályt kell kiegészíteni egy
Terjesszük ki a szabványos kimenetet a Vector osztályra, úgy, hogy egy v vektor a cout<<v utasítással kiírható legyen! Megoldás: - vagy az ostream osztályt kell kiegészíteni egy operator<<(Vector v) tagfüggvénnyel - vagy egy globális operator<<(ostream& s, Vector v) függvényt kell létrehozni:
14
Vector típusú adat kiírása
ostream& operator<< (ostream& s, Vector v) { s<< v.GetX() << v.GetY() ; return s ; }
15
Láncolás biztosítása Az első ostream típusú cout objektumot referenciaként vesszük át és visszatérési értékben is referenciaként adjuk vissza. A kapott cout objektum visszatérési értékként való átadására azért van szükség, hogy a megismert láncolás működjön.
16
Egy újabb feladat (CCurrency osztály létrehozása)
class CCurrency {private: long Dollars; int Cents; public: cCurrency() { Dollars = Cents = 0; } cCurrency(long Dol, int Cen) SetAmount ( Dol, Cen) ;
17
Értékek visszaadása void GetAmount(long *Pdol, int *PCen) {
*Pdol = Dollars; *Pcen= Cents; }
18
Értékek megadása void SetAmount(long Dol, int Cen) {
Dollars = Dol + Cen/100; Cents = Cen % 100; }
19
Adattagok megjelenítése
void PrintAmount() { cout.fill(„0”) ; cout.width (1) ; cout<<„$”<<Dollars << „. „ ; cout.width(2) ; cout << cents % 100 ; }
20
operator+ () class CCurrency { … public:
CCurrency operator+ (CCurrency Curr) CCurrency Temp (Dollars + Curr.Dollars, Cents + Curr.Cents); return Temp; } };
21
operator+() más megoldásasl
CCurrency operator+ (CCurrency Curr) { return CCurrency (Dollars + Curr.Dollars, Cents + Curr.Cents); }
22
Ccurrency Amount1 (12,95); Ccurrency Amount2 (4,38); Ccurrency Total; Total = Amount1 + Amount2; Amount1.operator+(Amount2);
23
operator+() túlterhelése
CCurrency operator+ (long Dol) { return CCurrency (Dollars + Dol, Cents); } Ccurrency Adv (235, 42); Adv = Adv + 100; Adv.operator+(100);
24
100.operator+(Adv); //globális metódus
CCurrency operator+ (long Dol, CCurrency &Curr) { return CCurrency (Dol+Curr.Dollars + Curr. Cents); }
25
class CCurrency { … friendCCurrency operator+ (long Dol, CCurrency &Curr); }; Adv= Adv;
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.