16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
1
Η Γλώσσα Προγραµµατισµού C++
(The C++ Programming Language)
∆ηµήτριος Κατσαρός, Ph.D.
Χειµώνας 2005
∆ιάλεξη 6η
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
2
Ιστοσελίδα του µαθήµατος
• http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm
• Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος
• Επικοινωνία: [email protected]
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
3
Περιεχόµενα
• Constructors• Overloading τελεστών• Φίλιες συναρτήσεις/κλάσεις• ∆υναµική δηµιουργία αντικειµένων
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
4
Στόχοι εκµάθησης
• Constructors– Ορισµοί– Κλήση
• Εργαλεία– const parameter modifier– Inline συναρτήσεις– Static µεταβλητές-µέλη
• Vectors– Εισαγωγή στην κλάση vector
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
5
Constructors
• Αρχικοποίηση των αντικειµένων– Αρχικοποίηση µερικών ή όλων των µεταβλητών που είναι µέλη του αντικειµένου
– Επιπρόσθετες λειτουργίες είναι δυνατές
• Είναι ειδική περίπτωση συνάρτησης-µέλους– Καλέιται αυτόµατα όταν δηλώνεται το αντικείµενο
• Πολύ χρήσιµα εργαλεία– Στηρίζουν τις αρχές του OOP
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
6
Ορισµοί Constructor
• Οι constructors ορίζονται όπως κάθε άλλη συνάρτηση-µέλος
– Εκτός από το ότι:1. Πρέπει να έχουν το ίδιο όνοµα µε την κλάση τους
2. ∆εν επιστρέφουν τιµή; Ούτε δηλώνονται ως void!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
7
Παράδειγµα ορισµού Constructor
• Ορισµός κλάσης µε constructor:– class DayOfYear
public:
DayOfYear(int monthValue, int dayValue);//Constructor initializes month & day
void input();void output();…
private:int month;int day;
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
8
Χρήσιµες παρατηρήσεις
• Παρατηρήστε το όνοµα του constructor: DayOfYear– Ίδιο µε το όνοµα της κλάσης του!
• Η δήλωση του Constructor δεν έχει τύπο επιστροφής– Ούτε void!
• Ο Constructor τοποθετείται στο τµήµα public– Καλείται όταν δηλώνονται τα αντικείµενα– Εάν δηλωθεί ως private, δεν θα µπορούµε να δηλώσουµε αντικείµενα!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
9
Κλήση των Constructors
• ∆ήλωση αντικειµένων:DayOfYear date1(7, 4), date2(5, 5);
• Τα αντικείµενα δηµιουργούνται εδώ– Καλείται ο Constructor– Οι τιµές στις παρενθέσεις περνιούνται ως ορίσµατα στον constructor
– Οι µεταβλητές-µέλη month, day αρχικοποιούνται:date1.month 7 date2.month 5date1.dat 4 date2.day 5
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
10
Ισοδυναµία Constructor
• Θεωρήστε:– DayOfYear date1, date2
date1.DayOfYear(7, 4); // ILLEGAL!date2.DayOfYear(5, 5); // ILLEGAL!
• Με πρώτη µατιά OK…– ∆ΕΝ ΕΠΙΤΡΕΠΕΤΑΙ να καλούµε τους
constructors όπως τις άλλες συναρτήσεις-µέλη!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
11
Κώδικας Constructor
• Ο ορισµός ενός Constructor είναι ίδιος µε αυτόν των άλλων συναρτήσεων-µελών:DayOfYear::DayOfYear(int monthValue, int dayValue)
month = monthValue;day = dayValue;
• Παρατηρήστε το ίδιο όνοµα γύρω από τα ::– Προσδιορίζει έναν constructor
• ∆εν υπάρχει τύπος επιστροφής
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
12
Εναλλακτικός ορισµός
• Ο προηγούµενος ορισµός είναι ιδσοδύναµος µε:
DayOfYear::DayOfYear( int monthValue,int dayValue )
: month(monthValue), day(dayValue) …
• Η τρίτη γραµµή ονοµάζεται “Τµήµα αρχικοποίησης”
• Το σώµα µένει κενό
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
13
Άλλος ένας σκοπός του Constructor
• Όχι απλώς να αρχικοποιήσει τα δεδοµένα
• Το σώµα δεν χρειάζεται να είναι κενό
• Ελέγξει την εγκυρότητα των δεδοµένων!– Να επιβεβαιώσει ότι µόνο έγκυρες τιµές ανατίθενται στις ιδιωτικές µεταβλητές της κλάσης
– Ισχυρή αρχή του OOP
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
14
Overloaded Constructors
• Μπορούµε να κάνουµε overload τους constructors όπως και τις απλές συναρτήσεις
• Θυµηθείτε: µια υπογραφή (signature)αποτελείται από:– Όνοµα της συνάρτησης– Λίστα παραµέτρων
• Να παρέχουµε constructors για όλες τις πιθανές λίστες ορισµάτων
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
15
Παράδ. κλάσης µε constructor (1/3)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
16
Παράδ. κλάσης µε constructor (2/3)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
17
Παράδ. κλάσης µε constructor (3/3)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
18
Constructor χωρίς ορίσµατα
• Προκαλεί σύγχυση µε απλές συναρτήσεις χωρίς ορίσµατα:– Καλούνται µε την εξής σύνταξη: callMyFunction();
• Με τις κενές παρανθέσεις
• ∆ηλώσεις αντικειµένων χωρίς αρχικοποίηση:– DayOfYear date1; // Ορθό!– DayOfYear date(); // ΛΑΘΟΣ!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
19
Ρητές κλήσεις στον Constructor
• Μπορούµε να καλέσουµε τον constructor ΞΑΝΑ, µετά τη δήλωση του αντικειµένου
• Θυµηθείτε: στην περίπτωση εκείνη ο constructor κλήθηκε αυτόµατα
– Τον καλούµε µε τον όνοµα του αντικειµένου; Τυπική κλήση συνάρτησης-µέλους
• Εύκολος τρόπος για να θέτουµε τιµές στις µεταβλητές-µέλη
• Μέθοδος αρκετά διαφορετική από την τυπική κλήση συνάρτησης-µέλους
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
20
Παράδ. ρητής κλήσης Constructor
• Μια τέτοια κλήση επιστρέφει ένα “ανώνυµο αντικείµενο”– Το οποίο µπορεί κατόπιν να αντεθεί
– Στην πράξη:DayOfYear holiday(7, 4);
• Ο Constructor καλείται στη δήλωση του αντικειµένου• Τώρα για “επαν-αρχικοποίηση” :
holiday = DayOfYear(5, 5);– Ρήτη κλήση constructor– Επιστρέφει ανώνυµο αντικείµενο– Ανατίθεται ξανά στο υπάρχον αντικείµενο
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
21
Default Constructor
• Ορίζεται ως : constructor χωρίς ορίσµατα
• Πάντα πρέπει να ορίζουµε κάποιον
• Αυτό-δηµιουργειται?– ΝΑΙ & ΌΧΙ– Εάν δεν έχει οριστεί ΚΑΝΕΝΑΣ constructor ΝΑΙ– Εάν έχει οριστεί κάποιος ΌΧΙ
• Εάν δεν υπάρχει default constructor:– ∆εν µπορούµε να δηλώσουµε το: MyClass myObject;
• Χωρίς αρχικοποιητές
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
22
Μεταβλητές-µέλη τύπου κλάσης
• Οι µεταβλητές-µέλη µιας κλάσης µπορεί να είναι οποιουδήποτε τύπου– Ακόµα και αντικείµενα άλλων κλάσεων!
• Στην περίπτωση αυτή χρειαζόµαστε ειδική σύνταξη για τους constructors– Ώστε να µπορούν να καλέσουν τον constructor του αντικειµένου-µέλους τους
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
23Παράδ. µεταβλητής-µέλους τύπου κλάσης (1/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
24Παράδ. µεταβλητής-µέλους τύπου κλάσης (2/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
25Παράδ. µεταβλητής-µέλους τύπου κλάσης (3/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
26Παράδ. µεταβλητής-µέλους τύπου κλάσης (4/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
27Παράδ. µεταβλητής-µέλους τύπου κλάσης (1/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
28
Μέθοδοι περάσµατος παραµέτρων
• Αποδοτικότητα µεθόδων περάσµατος παραµέτρων– Call-by-value
• Απαιτεί δηµιουργία αντιγράφου Κόστος– Call-by-reference
• ∆έσµευση θέσης (Placeholder) για το πραγµατικό όρισµα• Η πιο αποδοτική µέθοδος
– Αµελητέα διαφορά για τους βασικούς τύπους– Για κλάσεις/αντικείµενα καθαρό πλεονέκτηµα
• Call-by-reference είναι επιθυµητό– Ειδικά για “µεγάλους” τύπους δεδοµένων, όπως κλάσεις
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
29
Ο const parameter modifier
• Μεγάλοι τύποι δεδοµένων (τυπικά κλάσεις)– Επιθυµητό να χρησιµοποιούµε pass-by-reference– Ακόµα και εάν η συνάρτηση δεν πρόκειται να κάνει τροποποιήσεις
• Προστασία ορίσµατος– Χρήση του προσδιοριστή constant
• Αποκαλείται επίσης constant call-by-reference παράµετρος– Τοποθετείστε τη λέξη-κλειδί const πριν τον τύπο– Κάνει το όρισµα να είναι "read-only"– Προσπάθεια τροποποίησής του προκαλεί compiler
error
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
30
Χρήση του const
• Εάν δεν χρειάζονται τροποποιήσεις– Προστασία των παραµέτρων µε την const– Προστασία όλων αυτών των παραµέτρων
• Αυτό περιλαµβάνει και τις παραµέτρους των συναρτήσεων-µελών της κλάσης
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
31
Συναρτήσεις Inline
• Για συναρτήσεις που δεν είναι µέλη:– Χρήση της λέξης-κλειδί inline στη δήλωση της συνάρτησης καθώς και στο heading της συνάρτησης
• Για τις συναρτήσεις-µέλη:
– Τοποθετούµε την υλοποίηση (κώδικα) για την συνάρτηση ΜΕΣΑ ΣΤΗ δήλωση της κλάσης γίνεται αυτόµατα inline
• Χρήση µόνο για σύντοµες συναρτήσεις
• Στην ουσία, η κλήση αντικαθίσταται από τον πλήρη κώδικα– Απολοιφή του overhead– Πιο αποδοτικό, αλλά µόνο όταν είναι σύντοµη!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
32
Συναρτήσεις-µέλη Inline
• Ορισµοί συναρτήσεων-µελών– Συνήθως ορίζονται χωριστά, σε διαφορετικό αρχείο– Μπορούν να οριστούν ΜΕΣΑ στον ορισµό της κλάσης
• Κάνει τη συνάρτηση "in-line"
• Ξανά: χρήση µόνο για µικρές συναρτήσεις
• Πιο αποδοτικά– Εάν είναι πολύ µεγάλη είναι λιγότερο αποδοτική!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
33
Static Μέλη• Static µεταβλητές-µέλη
– Όλα τα αντικείµενα της κλάσης “µοιράζονται” ένα αντίγραφο
– Όταν τροποποιείται η µεταβλητή αυτή από ένα αντικείµενο όλα τα αντικείµενα της κλάσης βλέπουν την αλλαγή
– Αρχικοποιούνται εκτός κλάσης
• Χρήσιµο για “ιχνηλάτηση”– Πόσο συχνά καλείται µια συνάρτηση-µέλος– Πόσα αντικείµενα της κλάσης υπάρχουν σε µια δεδοµένη στιγµή
• Τοποθετήστε τη λέξη-κλειδί static πριν τον τύπο δεδοµένων
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
34
Συναρτήσεις Static• Οι συναρτήσεις-µέλη µπορεί και αυτές να είναι static
– Εάν δεν χρειάζεται προσπέλαση στα δεδοµένα του αντικειµένου
– Και πρέπει να είναι µέλος της κλάσης– Την κάνουµε συνάρτηση static
• Μπορεί να κληθεί εκτός της κλάσης– Από αντικείµενα που δεν ανήκουν στην κλάση:
• Π.χ., Server::getTurn();– Καθώς και από αντικείµενα της κλάσης
• Συνήθης µέθοδος: myObject.getTurn();
• Μπορούν να χρησιµοποιούν µόνο τα static δεδοµένα, και συναρτήσεις!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
35
Παράδειγµα Static Μελών (1/4)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
36
Παράδειγµα Static Μελών (2/4)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
37
Παράδειγµα Static Μελών (3/4)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
38
Παράδειγµα Static Μελών (4/4)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
39
Η κλάση Vector της STL
• Εισαγωγή στην κλάση Vector– Θυµηθείτε: οι πίνακες έχουν σταθερό µέγεθος
– Vectors: “πίνακες που µικραίνουν και µεγαλώνουν” κατά την εκτέλεση του προγράµµατος
– Προέρχονται από την Standard Template Library (STL)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
40
Τα βασικά για την κλάση Vector
• Όµοια µε τους πίνακες:– Έχει “βασικό τύπο”– Αποθηκεύει συλλογή από τιµές του βασικού τύπου
• ∆ηλώνεται διαφορετικά:– Σύνταξη: vector<Base_Type>
• Προσδιορίζει µια template class• Οποιοσδήποτε τύπος µπορεί να αποτελέσει το Base_Type• Παράγει µια νέα κλάση για διανύσµατα αυτού του τύπου
– Παράδειγµα δήλωσης:vector<int> v;
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
41
Χρήση του Vector
• vector<int> v;– “v είναι ένα vector τύπου int”– Καλεί τον default constructor της κλάσης
• ∆ηµιουργείται ένα κενό vector
• Υποστηρίζουν δεικτοδότηση για την προσπέλαση όπως και οι πίνακες
• Αλλά για την προσθήκη στοιχείων:– Πρέπει να κληθεί η συνάρτηση-µέλος push_back
• Συνάρτηση-µέλος size()– Επιστρέφει τον τρέχοντα αριθµό των στοιχείων του
vector
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
42
Παράδειγµα του Vector (1/2)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
43
Παράδειγµα του Vector (2/2)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
44
Αποδοτικότητα του Vector
• Συνάρτηση-µέλος capacity()– Επιστρέφει το µέγεθος µνήµης που είναι δεσµευµένο– ∆εν είναι το ίδιο µε το size()– Συνήθως, capacity > size
• Αυξάνει αυτόµατα όταν χρειαστεί
• Εάν η αποδοτικότητα είναι µείζον θέµα: – Μπορούµε να θέσουµε τις συµπεριφορές χειρωνακτικά
• v.reserve(32); //sets capacity to 32• v.reserve(v.size()+10); //sets capacity to 10 more than size
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
45
Περίληψη (1/2)
• Constructors: αυτόµατη αρχικοποίηση των αντικειµένων– Καλούνται όταν δηλώνονται τα αντικείµενα– Ο Constructor έχει το ίδιο όνοµα µε την κλάση
• Ο Default constructor δεν έχει παραµέτρους– Πάντα θα πρέπει να τον ορίζουµε
• Μεταβλητές-µέλη της class– Μπορεί να είναι αντικείµενα άλλης κλάσης
• Απαιτούν τµήµα-αρχικοποίησης
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
46
Περίληψη (2/2)
• Constant call-by-reference παράµετροι– Πιο αποδοτικά σε σχέση µε τις call-by-value
• Μπορούµε να κάνουµε inline πολύ µικρούς ορισµούς συναρτήσεων– Βελτιώνουν την αποτελεσµατικότητα
• Static µεταβλητές-µέλη– Κοινές για όλα τα αντικείµενα της κλάσης
• Κλάσεις Vector– Όπως: “πίνακες που µεγαλώνουν και µικραίνουν δυναµικά”
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
47
Περιεχόµενα
• Constructors• Overloading τελεστών• Φίλιες συναρτήσεις/κλάσεις• ∆υναµική δηµιουργία αντικειµένων
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
48
Στόχοι εκµάθησης
• Βασικός µηχανισµός overloading τελεστών– Μοναδιαίοι τελεστές– Ως συναρτήσεις-µέλη
• Friends και αυτόµατη µετατροπή τύπων– Συναρτήσεις friend, κλάσεις friend– Constructors για αυτόµατη µετατροπή τύπων
• References και overloading– << και >>– Τελεστές: = , [], ++, --
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
49
Υπερφόρτωση Τελεστών (1/2)
• Τελεστές +, -, %, ==, etc.– Είναι και αυτοί συναρτήσεις!
• Απλά καλούνται µε διαφορετική σύνταξη: x + 7 – "+" είναι δυαδικός τελεστής µε x και 7 ως τελεστέους
• ∆είτε το ως εξής:+(x, 7)– "+" είναι το όνοµα της συνάρτησης– x, 7 είναι τα ορίσµατα– Η συνάρτηση "+" επιστρέφει το άθροισµα των ορισµάτων της
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
50
Υπερφόρτωση Τελεστών (2/2)
• Ενσωµατωµένοι τελεστές– π.χ., +, -, = , %, ==, /, *– Λειτουργούν ήδη στη C++ για built-in τύπους– Στο συνήθη δυαδικό συµβολισµό
• Μπορούµε να τους υπερφορτώσουµε!– Για να λειτουργούν µε τους δικούς µας τύπους!– Για να προσθέσουµε "Chair types", ή "Money types"
• Όπως µας εξυπηρετεί
• Πάντοτε υπερφορτώνουµε για “παρόµοιες”λειτουργίες!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
51
Τα βασικά της υπερφόρτωσης
• Υπερφόρτωση τελεστών– ΠΟΛΥ όµοιο µε την υπερφόρτωση συναρτήσεων– Ο τελεστής παίζει το όνοµα της συνάρτησης
• Παράδειγµα δήλωσης:const Money operator +(const Money& amount1, const Money& amount2);
– Υπερφορτώνει το + για τελεστέους τύπου Money– Χρησιµοποιεί const παραµέτρους µε αναφορά για εποδοτικότητα
– Η επιστρεφόµενη τιµή είναι τύπου Money• Επιτρέπει πρόσθεση αντικειµένων "Money"
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
52
Ορισµός “+” για Money
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
53
Υπερφόρτωση “==”
• Τελεστής ισότητας, ==– Επιτρέπει σύγκριση αντικειµένων τύπου
Money– ∆ήλωση:
bool operator ==(const Money& amount1,const Money& amount2);
• Επιστρέφει τύπο bool type για ισότητα true/false– ∆εν είναι συνάρτηση-µέλος
(όπως δεν είναι και ο τελεστής “+”)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
54
Ορισµός “==” για Money
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
55Constructors που επιστρέφουν αντικείµενα
• Ο Constructor είναι µια "void" συνάρτηση?– Τον αντιµετωπίζουµε ως τέτοιο, αλλά δεν είναι– Είναι µια “ειδικού τύπου” συνάρτηση
• Με ξεχωριστές ιδιότητες• ΜΠΟΡΕΙ να επιστρέφει µια τιµή!
• Θυµηθείτε τη δήλωση return στην υπερφόρτωση του "+" για τύπους Money:– return Money(finalDollars, finalCents);
• Επιστρέφει ένα στιγµιότυπο της κλάσης Money!• Έτσι, ο constructor στην πραγµατικότητα “επιστέφει” ένα αντικείµενο!
• Αποκαλείται “ανώνυµο αντικείµενο”
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
56
Επιστροφή µιας const τιµής
• Θεωρήστε ξανά τον τελεστή "+":const Money operator +(const Money& amount1,
const Money& amount2);
– Επιστρέφει ένα “const αντικείµενο”?– Γιατί?
• ∆είτε την επίπτωση του να επιστρέψουµε ένα “non-const” αντικείµενο για να το αντιληφθείτε …
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
57
Επιστροφή µιας non-const τιµής
• Θεωρήστε “no const” στη δήλωση:Money operator +( const Money& amount1,
const Money& amount2);
• Θεωρήστε την έκφραση που καλεί:m1 + m2– Όπου τα m1 και m2 είναι αντικείµενα τύπου Money– Το αντικείµενο που επιστρέφεται είναι τύπου Money– Μπορούµε να κάνουµε διάφορα πράγµατα µε τα αντικείµενα!
• Όπως για παράδειγµα, να καλέσουµε τις συναρτήσεις-µέλη τους …
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
58Τι µπορούµε να κάνουµε µε non-const αντικείµενα
• Μπορούµε να καλέσουµε συναρτήσεις-µέλη:– Να εκτελέσουµε τις συναρτήσεις-µέλη του αντικειµένου που επιστρέφεται από την πράξη m1+m2:
• (m1+m2).output(); //Νόµιµο– ∆εν υπάρχει πρόβληµα, τίποτε δεν αλλάζει
• (m1+m2).input(); //ΝΟΜΙΜΟ!– ΠΡΟΒΛΗΜΑ! //Νόµιµο, αλλά ΤΡΟΠΟΠΟΙΕΙ κάτι!
• Επιτρέπει τροποποίηση ενός ανώνυµου αντικειµένου!• ∆εν µπρούµε να το επιτρέψουµε!
• Συνεπώς ορίσουµε το αντικείµενο επιστροφής να είναι const
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
59
Υπερφόρτωση µοναδιαίων τελεστών
• Η C++ έχει µοναδιαίους τελεστές:– Ορίζονται ως να δέχονται έναν τελεστέο– π.χ., - (άρνηση)
• x = -y; // Θέτει το x ίσο µε το αρνητικό του y
– Άλλοι µοναδιαίοι τελεστές:• ++, --
• Οι µοναδιαίοι τελεστές µπορούν επίσης να υπερφορτωθούν
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
60
Υπερφόρτωση του “-” για Money
• ∆ήλωση υπερφόρτωσης του “-”– Τοποθετείται εκτός δήλωση της κλάσης:
const Money operator –(const Money& amount);– Σηµειώστε: δέχεται µόνο ένα όρισµα
• Ο τελεστής "-" υπερφορτώνεται δύο φορές!– Για δυο τελεστέους/ορίσµατα (δυαδικός)– Για έναν τελεστέο/όρισµα (µοναδιαίος)– Πρέπει να υπάρχουν ορισµοί και για τις δυο περιπτώσεις
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
61
Overloaded "-" Definition
• Ορισµός υπερφόρτωσης "-":const Money operator –(const Money& amount)
return Money(-amount.getDollars(), -amount.getCents());
• Εφαρµόζει τον µοναδιαίο τελεστή “-” σε built-inτύπους, για τους οποίους η πράξη είναι γνωστή
• Επιστρέφει ανώνυµο αντικείµενο
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
62
Χρήση υπερφορτωµένου "-"
• Θεωρήστε το:Money amount1(10),
amount2(6),amount3;
amount3 = amount1 – amount2;• Καλεί τον δυαδικό υπερφορτωµένο "-"
amount3.output(); //Αποτέλεσµα $4.00amount3 = -amount1;
• Καλεί τον µοναδιαίο υπερφορτωµένο "-"
amount3.output() // Αποτέλεσµα -$10.00
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
63Υπερφορτωµένοι τελεστές ως συναρτήσεις-µέλη
• Στα προηγούµενα παραδείγµα: “ανεξάρτητες”συναρτήσεις– Ορισµένες έξω από κλάσεις
• Μπορεί να γίνει υπερφόρτωση ως "member operator"– Θεωρείται συνάρτηση-µέλος όπως και οι υπόλοιπες
Όταν ο τελεστής είναι συνάρτηση-µέλος:– Μόνο ΜΙΑ παράµετρος, όχι δυο!– Το καλούν αντικείµενο λειτουργεί ως 1st παράµετρος
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
64
Παράδειγµα Member Operator
• Money cost(1, 50), tax(0, 15), total;total = cost + tax;– Εάν ο "+" υπερφορτωθεί ως member operator:
• Η µεταβλητή/αντικείµενο cost είναι το καλούν αντικείµενο• Το αντικείµενο tax είναι το µοναδικό όρισµα
– Σκεφτείτε το ως εξής: total = cost.+(tax);
• ∆ήλωση του "+" στον ορισµό της κλάσης:– const Money operator +(const Money& amount);– Σηµειώστε το µοναδικό όρισµα του τελεστή
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
65
Συναρτήσεις const
• Πότε να κάνουµε µια συνάρτηση const?– Οι constant συναρτήσεις δεν επιτρέπεται να τροποποιούν τα δεδοµένα-µέλη της κλάσης
– Τα const objects µπορούν να καλούν ΜΟΝΟ constantσυναρτήσεις-µέλη
• Το καλό στυλ απαιτεί:– Κάθε συνάρτηση-µέλος που δεν πρόκειται να τροποποιήσει τα δεδοµένα θα πρέπει να δηλώνεται ως const
• Χρήση της λέξης-κλειδί const µετά τη δήλωση της συνάρτησης και στο heading της
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
66
Υπερφόρτωση Κλήσης Συνάρτησης ()
• Τελεστής κλήσης συνάρτησης, ( )– Πρέπει να υπερφορτωθεί ως συνάρτηση-µέλος– Επιτρέπει τη χρήση των αντικειµένων όπως µια τυπική συνάρτηση
– Μπορεί να υπερφορτωθεί για όλους τους πιθανούς αριθµούς ορισµάτων
• Παράδειγµα:Aclass anObject;anObject(42);
• Εάν υπερφορτωθεί ο ( ) καλεί την υπερφορτωµένη “έκδοση”
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
67
Άλλες υπερφορτώσεις
• &&, ||, και τελεστής comma– Οι προκαθορισµένες εκδόσεις τους δουλεύουν για boolτύπους
– Θυµηθείτε: χρησιµοποιούν την “short-circuit εκτίµηση”– Όταν υπερφορτωθούν, δεν την χρησιµοποιούν πλέον
• Χρησιµοποιούν την “πλήρη εκτίµηση”
• Γενικώς, θα πρέπει να αποφεύγουµε την υπερφόρτωσή τους
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
68
Συναρτήσεις Friend (1/2)
• ∆εν είναι συναρτήσεις-µέλη– Θυµηθείτε: υπερφόρτωση τελεστών ως µη συναρτήσεις-µέλη
• Προσπελάζουν τα δεδοµένα διαµέσου συναρτήσεων accessor και mutator
• Πολύ αναποτελεσµατικό (κόστος στις κλήσεις)
• Οι Friends µπορούν να προσπελάσουν άµεσα τα ιδιωτικά δεδοµένα της κλάσης– ∆εν υπάρχει κόστος, είναι πιο αποτελεσµατικό
• Συνεπώς: το καλύτερο είναι να κάνουµε friendsτις nonmember operator υπερφορτώσεις!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
69
Συναρτήσεις Friend (1/2)
• Συναρτήσεις Friend µιας κλάσης– ∆εν είναι συνάρτηση-µέλος– Έχει άµεση πρόσβαση στα ιδιωτικά δεδοµένα της κλάσης
• Όπως και οι συναρτήσεις-µέλη της κλάσης
• Χρήση της λέξης-κλειδί friend πριν από τη δήλωση της συνάρτησης– Καθορίζεται ΜΕΣΑ στον ορισµό της κλάσης– ∆εν είναι όµως συναρτήσεις-µέλη της κλάσης!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
70
Χρήση συναρτήσεων Friend
• Υπερφόρτωση τελεστών– Είναι η πιο κοινή χρήση των friends
– Βελτιώνει την αποδοτικότητα
– Αποφεύγει την ανάγκη κλήσης συναρτήσεων-µελών accessor/mutator
• Friend µπορεί να είναι οποιαδήποτε συνάρτηση
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
71
Αναγκαιότητα συναρτήσεων Friend
• Οι Friend είναι “καθαρές”?– To “πνεύµα” του OOP επιβάλλει όλοι οι τελεστές και οι συναρτήσεις να είναι µέλη της κλάσης
– Πιστεύεται ότι οι friends παραβιάζουν τις βασικές αρχές του OOP
• Έχουν πλεονεκτήµατα?– Για τους τελεστές: πάρα πολλά!– Επιτρέπουν αυτόµατα µετατροπή τύπων– Υποστηρίζουν την ενθυλάκωση: οι friends είναι µέσα σε κάποιον ορισµό κλάσης
– Βελτιώνουν την απόδοση
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
72
Κλάσεις Friend
• Ολόκληρες κλάσεις µπορεί να είναι friends– Όοµοια µε τις συναρτήσεις που είναι friend σε µια κλάση
– Παράδειγµα:class F is friend of class C
• Όλες οι συναρτήσεις-µέλη της κλάσης F είναι friends της κλάσης C
• H friend-ship δεν αίρεται
• Σύνταξη: friend class F;– Μπαίνει µέσα στον ορισµό της κλάσης, η οποία δίνει την “εξουσιοδότηση” στην F
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
73
Αναφορές (References)
• Αναφορά (Reference) ορίζεται ως:– Όνοµα µιας θέσης αποθήκευσης– Παρόµοια µε το δείκτη
• Παράδειγµα µιας stand alone reference:– int robert;
int& bob = robert;• bob είναι αναφορά στη θέσης αποθήκευσης του robert• Οι αλλαγές στο bob θα επηρρεάσουν το robert
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
74
Χρήση Αναφορών
• Είναι σχετικά επικίνδυνες
• Χρήσιµες σε µερικές περιπτώσεις:
• Call-by-reference– Συχνά χρησιµοποιείται για την υλοποίηση του
µηχανισµού αυτού
• Επιστρέφοντας µια αναφορά– Επιτρέπει υλοποιήσεις υπερφόρτωσης τελεστών να γραφούν πιο “φυσικά”
– Σκεφτείτε το ως επιστροφή ενός "alias" σε µια µεταβλητή
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
75
Επιστροφή Αναφορών
• Σύνταξη:double& sampleFunction(double& variable);– double& and double are different– Πρέπει να ταιριάζουν στη δήλωση και στο
heading της συνάρτησης
• Το επιστρεφόµενο item πρέπει να έχει µια αναφορά– Όπως µια µεταβλητή αυτού του τύπου– ∆εν µπορεί να είναι εκφράσεις όπως: "x+5"
• ∆εν υπάρχει µέρος στη µνήµη στο οποίο να αναφερθεί
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
76
Παράδειγµα επιστροφής αναφοράς
• Παράδειγµα ορισµού συνάρτησης:double& sampleFunction(double& variable)
return variable;
• Απλό παράδειγµα επίδειξης των εννοιών
• Κύρια χρήση:– Σε µερικούς υπερφορτωµένους τελεστές
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
77
Υπερφόρτωση των >> και <<
• Επιτρέπει είσοδο και έξοδο των αντικειµένων που φτιάχνουµε– Παρόµοια µε την υπερφόρτωση των άλλων τελεστών
• Βελτιώνει την αναγνωσιµότητα των προγραµµάτων– Επιτρέπει:
cout << myObject;cin >> myObject;
– Αντί για την ανάγκη να γράφουµε:myObject.output(); …
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
78
Υπερφόρτωση <<
• Τελεστής <<– Χρησιµοποιείται µε cout– Είναι δυαδικός τελεστής
• Παράδειγµα:cout << "Hello";– Ο τελεστής είναι ο <<– Ο 1ος τελεστέος είναι το προκαθορισµένο αντικείµενο cout
• Από τη βιβλιοθήκη iostream
– Ο 2ος τελεστέος είναι το αλφαριθµητικό "Hello"
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
79
Υπερφόρτωση <<
• Τελεστέοι του <<– Το αντικείµενο cout, της κλασης ostream– Η δική µας κλάση
• Θυµηθείτε την κλάση Money– Χρησιµοποιούσε τη συνάρτηση-µέλος output()– Θα ήταν προτιµότερο να χρησιµοποιούσαµε τον τελεστή <<:
Money amount(100);cout << "I have " << amount << endl;
αντί για το:cout << "I have ";amount.output();
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
80
Τιµή επιστροφής υπερφορτωµένου >>
• Money amount(100);cout << amount;– Ο τελεστής << πρέπει να επιστρέφει κάποια τιµή– Για να επιτρέψουµε “διαδοχικά” ορίσµατα:
cout << "I have " << amount;(cout << "I have ") << amount;
• Τα παραπάνω είναι ισοδύναµα
• Τι επιστρέφει?– cout object!
• Επιστρέφει αντικείµενο κλάσης του πρώτου ορίσµατος, ostream
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
81
Παρ. υπερφόρτωσης << και >> (1/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
82
Παρ. υπερφόρτωσης << και >> (2/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
83
Παρ. υπερφόρτωσης << και >> (3/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
84
Παρ. υπερφόρτωσης << και >> (4/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
85
Παρ. υπερφόρτωσης << και >> (5/5)
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
86
Τελεστής ανάθεσης, =
• Θα πρέπει να υπερφορτωθεί ως member operator• Υπερφορτώνεται αυτόµατα
– Εξ’ ορισµού τελεστής ανάθεσης:• Αντιγραφή µελος-προς-µέλος• Μεταβλητές-µέλη ενός αντικειµένου στις αντίστοιχες µεταβλητές-µέλη του άλλου αντικειµένου
• Η εξ’ ορισµού συµπεριφορά είναι OK για απλές κλάσεις– Αλλά για δείκτες πρέπει να γράψουµε τον δικό
µας τελεστή ανάθεσης!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
87
Increment και Decrement• Κάθε τελεστής έχει δυο “εκδόσεις”
– Προθεµατικός τελεστής: ++x;– Μεταθεµατικός τελεστής: x++;
• Πρέπει να γίνει η διάκριση στην υπερφόρτωση– Τυπικά υπερφορτώνεται η προθεµατική έκδοση– Προσθέτουµε 2ο παράµετρο τύπου intΜεταθεµατική
• Απλά ένα σύµβολο για τον compiler!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
88
Υπερφόρτωση τελεστή πίνακα, [ ]
• Μπορούµε να υπερφορτώσουµε τον [ ]– Για να χρησιµοποιείται για αντικείµενα των κλάσεων που ορίζουµε
–Ο τελεστής πρέπει να επιστρέφει µια αναφορά!
–Ο τελεστής [ ] πρέπει να είναι συνάρτηση-µέλος!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
89
Περίληψη (1/2)
• Οι built-in τελεστές της C++ µπορούν να υπερφορτωθούν για να λειτουργήσουν για τις δικές µας κλάσεις
• Οι τελεστές είναι απλά συναρτήσεις
• Οι συναρτήσεις friend έχουν άµεση πρόσβαση στα ιδιωτικά δεδοµένα των κλάσεων
• Οι τελεστές µπορούν να υπερφορτωθούν ως συναρτήσεις µέλη– Ο 1ος τελεστέος είναι το καλούν αντικείµενο
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
90
Περίληψη (2/2)
• Οι συναρτήσεις friend απλά προσθέτουν αποδοτικότητα– ∆εν χρειάζονται, εάν υπάρχουν αρκετές συναρτήσεις
accessors/mutators
• Οι αναφορές “ονοµατίζουν” µια µεταβητή µε ένα alias
• Μπορούµε να υπερφορτώσουµε τους << και >>– Ο τύπος επιστροφής είναι µια αναφορά σε τύπο stream
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
91
Περιεχόµενα
• Constructors• Overloading τελεστών• Φίλιες συναρτήσεις/κλάσεις• ∆υναµική δηµιουργία αντικειµένων
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
92
Πίσω στις κλάσεις• Ο τελεστής ->
– Σύντοµος συµβολισµός
• Συνδυάζει τους τελεστές: dereference (*) και dot (.)
• Καθορίζει το µέλος της κλάσης που δείχνεται από τον συγκεκριµένο δείκτη
• Παράδειγµα:MyClass *p;p = new MyClass;p->grade = "A"; //Equivalent to:(*p).grade = "A";
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
93
Ο δείκτης this• Οι ορισµοί των συναρτήσεων-µελών πολλές φορές χρειάζεται να αναφέρονται στο καλούν αντικείµενο
• Χρήση του προκαθορισµένου δείκτη this– Αυτόµατα δείχνει στο καλούν αντικείµενο:
Class Simplepublic:
void showStuff() const;private:
int stuff;;
• Οι συναρτήσεις-µέλη µπορούν να χρησιµοποιούν οποιονδήποτε από τα παρακάτω για προσπέλαση:cout << stuff;cout << this->stuff;
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
94
Υπερφόρτωση τελεστή ανάθεσης (1/2)
• Ο τελεστής ανάθεσης επιστρέφει αναφορά– ΄Έτσι ώστε “αλυσίδες” αναθέσεων να είναι πιθανές
– π.χ., a = b = c;• Θέτει τα a και b ίσα µε το c
• Ο τελεστής πρέπει να επιστρέφει “ίδιο τύπο” µε αυτόν αριστερά του– Για να επιτρέψει τις “αλυσίδες”– Ο δείκτης this βοηθάει σ’ αυτό!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
95
Υπερφόρτωση τελεστή ανάθεσης (2/2)
• Θυµηθείτε: Ο τελεστής ανάθεσης πρέπει να είναι µέλος της κλάσης– Έχει µόνο µια παράµετρο– Ο αριστερός τελεστέος είναι το καλούν αντικείµενο
s1 = s2;
• Σκεφτείται το ως εξής: s1.=(s2);
• s1 = s2 = s3;– Απαιτεί (s1 = s2) = s3;– Έτσι το (s1 = s2) πρέπει να επιστρέφει αντικείµενο του ίδιου τύπου µε τον τύπο του s1
• Και να το περάσει στο “ = s3”;
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
96
Ορισµός υπερφορτωµένου τελεστή =• Παράδειγµα µε χρήση της κλάσης string:
StringClass& StringClass::operator=(const StringClass& rtSide)
if (this == &rtSide) // if right side same as left sidereturn *this;
else
capacity = rtSide.length;lengthlength = rtSide.length;delete [] a;a = new char[capacity];for (int I = 0; I < length; I++)
a[I] = rtSide.a[I];return *this;
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
97
“Ρηχά” και “βαθιά” αντίγραφα
• “Ρηχό” αντίγραφο– Η ανάθεση αντιγράφει µόνο τα περιεχόµενα των
µεταβλητών-µελών– Η εξ’ ορισµού ανάθεση και ο copy constructor
• “Βαθύ” αντίγραφο– ∆είκτες, εµπλέκεται δυναµική µνήµη– Πρέπει να βρούµε πού δείχνει ο δείκτης για να πάρουµε τα δεδοµένα του για αντιγραφή
– Γράψτε το δικό σας τελεστή ανάθεσης και copy constructor για τις περιπτώσεις αυτές!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
98
Η ανάγκη για destructor• ∆υναµικά δεσµευµένες µεταβλητές
– ∆εν εξαλείφονται µέχρι να “διαγραφούν”• Εάν οι δείκτες είναι δηµόσια δεδοµένα της κλάσης
– Την αποδέσµευση µπορεί να την κάνουν άλλες “εξωτερικές της κλάσης” συναρτήσεις
• Εάν οι δείκτες είναι ιδιωτικά µόνο δεδοµένα της κλάσης– ∆υναµικά δεσµεύουν “πραγµατικά” δεδοµένα
• Στον constructor– Πρέπει να υπάρχει τρόπος για να τα “αποδεσµεύσουµε”όταν καταστραφεί το αντικείµενο
• Απάντηση: ο destructor!
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
99
Destructor
• Η αντίθετη έννοια του constructor– Καλείται αυτόµατα όταν το αντικείµενο βρεθεί “out-of-
scope”– Η εξ’ ορισµού έκδοση καταστρέφει µόνο τις συνήθεις
µεταβλητές και όχι τις δυναµικές
• Ορίζεται όπως ο constructor, αλλά προσθέτουµε το tilde ~– MyClass::~MyClass()
//Perform delete clean-up duties
16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας
100
Copy Constructors• Καλούνται αυτόµατα όταν:
1. ∆ηλώνεται ένα αντικείµενο κλάσης και αρχικοποιείται σε κάποιο άλλο αντικείµενο
2. Όταν µια συνάρτηση επιστρέφει αντικείµενο3. Όταν όρισµα τύπου κλάσης περνάει ως πραγµατικό όρισµα
σε µια κλήση-µε-τιµή
• Απαιτεί “προσωρινό αντίγραφο” του αντικειµένου– Ο copy constructor το δηµιουργεί
• Εξ’ ορισµού copy constructor– Όπως και ο εξ’ ορισµού τελεστής ανάθεσης "=", εκτελεί
αντιγραφή µέλος-προς-µέλος
• ∆είκτες γράψτε το δικό του copy constructor!
Top Related