Οντοκεντρικόσ Ρρογραμματιςμόσ Ενότθτα 7: C++ TEMPLATES, ΥΡΕΦΟΤΩΣΗ ΤΕΛΕΣΤΩΝ, ΕΞΑΙΕΣΕΙΣ Υπερφόρτωςθ Τελεςτών Ιωάννθσ Χατηθλυγεροφδθσ Ρολυτεχνικι Σχολι Τμιμα Μθχανικών Η/Υ & Ρλθροφορικισ
Υπερφόρτωςθ Τελεςτών
Υπερφόρτωςθ Τελεςτών Τφποι Τελεςτών o Built in (int, char) ι οριςμζνοι από τον χριςτθ ( user-defined) o Χριςθ υπαρχόντων τελεςτών με τφπουσ οριςμζνουσ από τον χριςτθ Υπερφόρτωςθ Τελεςτών o Δθμιουργία ςυνάρτθςθσ για τθν κλάςθ o Το όνομα τθσ ςυνάρτθςθσ είναι operator ακολουκοφμενο από το ςφμβολο του τελεςτι Ρ.χ: Operator+ για τον τελεςτι πρόςκεςθσ + 3/17
Υπερφόρτωςθ Τελεςτών ςε Κλάςθ Χριςθ τελεςτών ςε αντικείμενα κλάςεων o Ρρζπει πρώτα να γίνει υπερφόρτωςθ τουσ για τθν κλάςθ Εξαιρζςεισ (δεν χρειάηεται υπερφόρτωςθ): Τελεςτισ ανάκεςθσ, = Memberwise ανάκεςθ μεταξφ αντικειμζνων Τελεςτισ διεφκυνςθσ, Επιςτρζφει τθ διεφκυνςθ του αντικειμζνου & Μποροφν να υπερφορτωκοφν αν κζλουμε διαφορετικι ςυμπεριφορά ( όπωσ και ο τελεςτισ κόμμα:, ) o Ρροςφζρουν πιο ςφντομθ και κατανοθτι διατφπωςθ: object2 = object1.add(object2); object2 = object2 + object1; 4/17
Διακζςιμοι Τελεςτζσ Τελεζηές ποσ μπορούν να σπερθορηωθούν + - * / % ^ & ~! = < > += -= *= /= %= ^= &= = << >> >>= <<= ==!= <= >= && ++ -- ->*, -> [] () new delete new[] delete[] Τελεζηές ποσ δεν μπορούν να σπερθορηωθούν..* ::?: sizeof 5/17
Υπερφόρτωςθ Τελεςτι ωσ μζλοσ κλάςθσ Operator functions ι ωσ Friend ςυνάρτθςθ o Ωσ μζκοδοσ (μζλοσ τθσ κλάςθσ) Το αριςτερό μζλοσ του τελεςτι είναι το αντικείμενο για το οποίο καλείται (μποροφμε να χρθςιμοποιιςουμε και τον τελεςτιthis για να αναφερκοφμε ςε αυτό). Ρροφανώσ είναι ιδίου τφπου με τθν κλάςθ ςτθν οποία ορίηουμε τον τελεςτι. Το δεξιά μζλοσ του τελεςτι είναι όριςμα τθσ ςυνάρτθςθσ (οτιδιποτε τφπου κζλουμε) o Ωσ ςυνάρτθςθ (εκτόσ τθσ κλάςθσ, όχι μζκοδοσ ) Ρρζπει να δοκοφν και οι δφο παράμετροι (πριν και μετά τον τελεςτι) ωσ ορίςματα Ρρζπει να είναι friend ςυνάρτθςθ (προςκζτουμε ςχετικι διλωςθ ςτθν κλάςθ) για να προςπελάςει private ι protected μζλθ o (), [], -> = πρζπει να οριςτοφν ωσ μζλθ τθσ κλάςθσ o Καλοφνται Πταν το αριςτερό μζλοσ του τελεςτι (για binary τελεςτζσ) είναι αντικείμενο τθσ κλάςθσ Το μοναδικό όριςμα (για unary τελεςτζσ) είναι αντικείμενο τθσ κλάςθσ 6/17
Παράδειγμα class mydate{ friend ostream &operator<<( ostream &, const mydate & ); friend istream &operator>>( istream &, mydate & ); public: mydate(int d=5, int m=5, int y=1994) :day(d), month(m), year(y) {} bool operator==( const mydate &right ) const; mydate& operator++(); mydate operator++( int ); int operator[]( char i ); private: int day, month, year; }; Υπερφόρτωςθ ςυναρτιςεων μελών τθσ κλάςθσ Υπερφόρτωςθ ςυναρτιςεων μθ- μελών τθσ κλάςθσ (απλά διλωςθ ωσ friend) 7/17
Παράδειγμα class mydate{ friend ostream &operator<<( ostream &, const mydate & ); friend istream &operator>>( istream &, mydate & ); public: mydate(int d=5, int m=5, int y=1994) :day(d), month(m), year(y) {} bool operator==( const mydate &right ) const; mydate& operator++(); mydate operator++( int ); int operator[]( char i ); private: int day, month, year; }; bool mydate::operator==( const mydate &right ) const{ if ((day == right.day) && (month == right.month) && (year == right.year)) return true; return false; } int mydate::operator[]( char i ){ switch (i){ case 'm': return month; case 'y': return year; case 'd': return day; default: return -1; } } 8/17
Παράδειγμα class mydate{ friend ostream &operator<<( ostream &, const mydate & ); friend istream &operator>>( istream &, mydate & ); public: mydate(int d=5, int m=5, int y=1994) :day(d), month(m), year(y) {} bool operator==( const mydate &right ) const; mydate& operator++(); mydate operator++( int ); int operator[]( char i ); private: int day, month, year; }; istream &operator>>( istream &input, mydate &a ){ input >> a.year >> a.month >> a.day; return input; } ostream &operator<<( ostream &output, const mydate &a ){ output << a.year << "/" << a.month << "/" << a.day; return output; } mydate &mydate::operator++() { day++; return *this; } mydate mydate::operator++( int ) { mydate temp = *this; day++; return temp; } 9/17
Παράδειγμα class mydate{ friend ostream &operator<<( ostream &, const mydate & ); friend istream &operator>>( istream &, mydate & ); public: mydate(int d=5, int m=5, int y=1994) :day(d), month(m), year(y) {} bool operator==( const mydate &right ) const; mydate& operator++(); mydate operator++( int ); int operator[]( char i ); private: int day, month, year; }; int main(){ mydate dt1(15,7,2015); mydate dt2(25,9,2014); mydate dt3; cin >> dt3; cout << dt2 <<endl; cout << ++dt1; cout << dt1++ <<endl; cout << "Month: " << dt2['m'] <<endl; cout << ((dt1 == dt2)?"same date":"different date"); } 10/17
Πρόςκετο Υλικό Μελετιςτε και τα παραδείγματα από το Κεφάλαιο 10 του βιβλίου: «C++ How to Program, 9/e Paul & Harvey Deitel» http://media.pearsoncmg.com/ph/esm/deitel/cpp_htp_9/code_examples/code_examples.zip 11/17
Χρθματοδότθςθ Το παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Το ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο Πανεπιςτιμιο Ακθνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Το ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Ρρογράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εκνικοφσ πόρουσ. 12/17
Σθμείωμα Ιςτορικοφ Εκδόςεων Ζργου Το παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 13/17
Σθμείωμα Αναφοράσ Copyright: Ρανεπιςτιμιον Ρατρών, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Ρρογραμματιςμόσ». Ζκδοςθ: 1.0. Ράτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 14/17
Σθμείωμα Αδειοδότθςθσ Το παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Ραρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «Σθμείωμα Χριςθσ Ζργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μθ Εμπορικι ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ Σθμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το Σθμείωμα Αναφοράσ το Σθμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ Σθμειωμάτων το Σθμείωμα Χριςθσ Ζργων Τρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 16/17
Σθμείωμα Χριςθσ Ζργων Τρίτων Οι διαφάνειεσ βαςίηονται ςτο βιβλίο «C++ How to Program, 8th Edition, Harvey M. Deitel, Paul J. Deitel, Prentice Hall.» 17/17