Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming...

100
16/11/2005 Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήμιο Θεσσαλίας 1 Η Γλώσσα Προγραμματισμού C++ (The C++ Programming Language) ∆ημήτριος Κατσαρός, Ph.D. Χειμώνας 2005 ∆ιάλεξη 6η

Transcript of Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming...

Page 1: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

1

Η Γλώσσα Προγραµµατισµού C++

(The C++ Programming Language)

∆ηµήτριος Κατσαρός, Ph.D.

Χειµώνας 2005

∆ιάλεξη 6η

Page 2: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

2

Ιστοσελίδα του µαθήµατος

• http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm

• Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος

• Επικοινωνία: [email protected]

Page 3: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

3

Περιεχόµενα

• Constructors• Overloading τελεστών• Φίλιες συναρτήσεις/κλάσεις• ∆υναµική δηµιουργία αντικειµένων

Page 4: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

4

Στόχοι εκµάθησης

• Constructors– Ορισµοί– Κλήση

• Εργαλεία– const parameter modifier– Inline συναρτήσεις– Static µεταβλητές-µέλη

• Vectors– Εισαγωγή στην κλάση vector

Page 5: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

5

Constructors

• Αρχικοποίηση των αντικειµένων– Αρχικοποίηση µερικών ή όλων των µεταβλητών που είναι µέλη του αντικειµένου

– Επιπρόσθετες λειτουργίες είναι δυνατές

• Είναι ειδική περίπτωση συνάρτησης-µέλους– Καλέιται αυτόµατα όταν δηλώνεται το αντικείµενο

• Πολύ χρήσιµα εργαλεία– Στηρίζουν τις αρχές του OOP

Page 6: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

6

Ορισµοί Constructor

• Οι constructors ορίζονται όπως κάθε άλλη συνάρτηση-µέλος

– Εκτός από το ότι:1. Πρέπει να έχουν το ίδιο όνοµα µε την κλάση τους

2. ∆εν επιστρέφουν τιµή; Ούτε δηλώνονται ως void!

Page 7: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

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;

Page 8: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

8

Χρήσιµες παρατηρήσεις

• Παρατηρήστε το όνοµα του constructor: DayOfYear– Ίδιο µε το όνοµα της κλάσης του!

• Η δήλωση του Constructor δεν έχει τύπο επιστροφής– Ούτε void!

• Ο Constructor τοποθετείται στο τµήµα public– Καλείται όταν δηλώνονται τα αντικείµενα– Εάν δηλωθεί ως private, δεν θα µπορούµε να δηλώσουµε αντικείµενα!

Page 9: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

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

Page 10: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

10

Ισοδυναµία Constructor

• Θεωρήστε:– DayOfYear date1, date2

date1.DayOfYear(7, 4); // ILLEGAL!date2.DayOfYear(5, 5); // ILLEGAL!

• Με πρώτη µατιά OK…– ∆ΕΝ ΕΠΙΤΡΕΠΕΤΑΙ να καλούµε τους

constructors όπως τις άλλες συναρτήσεις-µέλη!

Page 11: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

11

Κώδικας Constructor

• Ο ορισµός ενός Constructor είναι ίδιος µε αυτόν των άλλων συναρτήσεων-µελών:DayOfYear::DayOfYear(int monthValue, int dayValue)

month = monthValue;day = dayValue;

• Παρατηρήστε το ίδιο όνοµα γύρω από τα ::– Προσδιορίζει έναν constructor

• ∆εν υπάρχει τύπος επιστροφής

Page 12: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

12

Εναλλακτικός ορισµός

• Ο προηγούµενος ορισµός είναι ιδσοδύναµος µε:

DayOfYear::DayOfYear( int monthValue,int dayValue )

: month(monthValue), day(dayValue) …

• Η τρίτη γραµµή ονοµάζεται “Τµήµα αρχικοποίησης”

• Το σώµα µένει κενό

Page 13: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

13

Άλλος ένας σκοπός του Constructor

• Όχι απλώς να αρχικοποιήσει τα δεδοµένα

• Το σώµα δεν χρειάζεται να είναι κενό

• Ελέγξει την εγκυρότητα των δεδοµένων!– Να επιβεβαιώσει ότι µόνο έγκυρες τιµές ανατίθενται στις ιδιωτικές µεταβλητές της κλάσης

– Ισχυρή αρχή του OOP

Page 14: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

14

Overloaded Constructors

• Μπορούµε να κάνουµε overload τους constructors όπως και τις απλές συναρτήσεις

• Θυµηθείτε: µια υπογραφή (signature)αποτελείται από:– Όνοµα της συνάρτησης– Λίστα παραµέτρων

• Να παρέχουµε constructors για όλες τις πιθανές λίστες ορισµάτων

Page 15: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

15

Παράδ. κλάσης µε constructor (1/3)

Page 16: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

16

Παράδ. κλάσης µε constructor (2/3)

Page 17: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

17

Παράδ. κλάσης µε constructor (3/3)

Page 18: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

18

Constructor χωρίς ορίσµατα

• Προκαλεί σύγχυση µε απλές συναρτήσεις χωρίς ορίσµατα:– Καλούνται µε την εξής σύνταξη: callMyFunction();

• Με τις κενές παρανθέσεις

• ∆ηλώσεις αντικειµένων χωρίς αρχικοποίηση:– DayOfYear date1; // Ορθό!– DayOfYear date(); // ΛΑΘΟΣ!

Page 19: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

19

Ρητές κλήσεις στον Constructor

• Μπορούµε να καλέσουµε τον constructor ΞΑΝΑ, µετά τη δήλωση του αντικειµένου

• Θυµηθείτε: στην περίπτωση εκείνη ο constructor κλήθηκε αυτόµατα

– Τον καλούµε µε τον όνοµα του αντικειµένου; Τυπική κλήση συνάρτησης-µέλους

• Εύκολος τρόπος για να θέτουµε τιµές στις µεταβλητές-µέλη

• Μέθοδος αρκετά διαφορετική από την τυπική κλήση συνάρτησης-µέλους

Page 20: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

20

Παράδ. ρητής κλήσης Constructor

• Μια τέτοια κλήση επιστρέφει ένα “ανώνυµο αντικείµενο”– Το οποίο µπορεί κατόπιν να αντεθεί

– Στην πράξη:DayOfYear holiday(7, 4);

• Ο Constructor καλείται στη δήλωση του αντικειµένου• Τώρα για “επαν-αρχικοποίηση” :

holiday = DayOfYear(5, 5);– Ρήτη κλήση constructor– Επιστρέφει ανώνυµο αντικείµενο– Ανατίθεται ξανά στο υπάρχον αντικείµενο

Page 21: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

21

Default Constructor

• Ορίζεται ως : constructor χωρίς ορίσµατα

• Πάντα πρέπει να ορίζουµε κάποιον

• Αυτό-δηµιουργειται?– ΝΑΙ & ΌΧΙ– Εάν δεν έχει οριστεί ΚΑΝΕΝΑΣ constructor ΝΑΙ– Εάν έχει οριστεί κάποιος ΌΧΙ

• Εάν δεν υπάρχει default constructor:– ∆εν µπορούµε να δηλώσουµε το: MyClass myObject;

• Χωρίς αρχικοποιητές

Page 22: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

22

Μεταβλητές-µέλη τύπου κλάσης

• Οι µεταβλητές-µέλη µιας κλάσης µπορεί να είναι οποιουδήποτε τύπου– Ακόµα και αντικείµενα άλλων κλάσεων!

• Στην περίπτωση αυτή χρειαζόµαστε ειδική σύνταξη για τους constructors– Ώστε να µπορούν να καλέσουν τον constructor του αντικειµένου-µέλους τους

Page 23: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

23Παράδ. µεταβλητής-µέλους τύπου κλάσης (1/5)

Page 24: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

24Παράδ. µεταβλητής-µέλους τύπου κλάσης (2/5)

Page 25: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

25Παράδ. µεταβλητής-µέλους τύπου κλάσης (3/5)

Page 26: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

26Παράδ. µεταβλητής-µέλους τύπου κλάσης (4/5)

Page 27: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

27Παράδ. µεταβλητής-µέλους τύπου κλάσης (1/5)

Page 28: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

28

Μέθοδοι περάσµατος παραµέτρων

• Αποδοτικότητα µεθόδων περάσµατος παραµέτρων– Call-by-value

• Απαιτεί δηµιουργία αντιγράφου Κόστος– Call-by-reference

• ∆έσµευση θέσης (Placeholder) για το πραγµατικό όρισµα• Η πιο αποδοτική µέθοδος

– Αµελητέα διαφορά για τους βασικούς τύπους– Για κλάσεις/αντικείµενα καθαρό πλεονέκτηµα

• Call-by-reference είναι επιθυµητό– Ειδικά για “µεγάλους” τύπους δεδοµένων, όπως κλάσεις

Page 29: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

29

Ο const parameter modifier

• Μεγάλοι τύποι δεδοµένων (τυπικά κλάσεις)– Επιθυµητό να χρησιµοποιούµε pass-by-reference– Ακόµα και εάν η συνάρτηση δεν πρόκειται να κάνει τροποποιήσεις

• Προστασία ορίσµατος– Χρήση του προσδιοριστή constant

• Αποκαλείται επίσης constant call-by-reference παράµετρος– Τοποθετείστε τη λέξη-κλειδί const πριν τον τύπο– Κάνει το όρισµα να είναι "read-only"– Προσπάθεια τροποποίησής του προκαλεί compiler

error

Page 30: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

30

Χρήση του const

• Εάν δεν χρειάζονται τροποποιήσεις– Προστασία των παραµέτρων µε την const– Προστασία όλων αυτών των παραµέτρων

• Αυτό περιλαµβάνει και τις παραµέτρους των συναρτήσεων-µελών της κλάσης

Page 31: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

31

Συναρτήσεις Inline

• Για συναρτήσεις που δεν είναι µέλη:– Χρήση της λέξης-κλειδί inline στη δήλωση της συνάρτησης καθώς και στο heading της συνάρτησης

• Για τις συναρτήσεις-µέλη:

– Τοποθετούµε την υλοποίηση (κώδικα) για την συνάρτηση ΜΕΣΑ ΣΤΗ δήλωση της κλάσης γίνεται αυτόµατα inline

• Χρήση µόνο για σύντοµες συναρτήσεις

• Στην ουσία, η κλήση αντικαθίσταται από τον πλήρη κώδικα– Απολοιφή του overhead– Πιο αποδοτικό, αλλά µόνο όταν είναι σύντοµη!

Page 32: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

32

Συναρτήσεις-µέλη Inline

• Ορισµοί συναρτήσεων-µελών– Συνήθως ορίζονται χωριστά, σε διαφορετικό αρχείο– Μπορούν να οριστούν ΜΕΣΑ στον ορισµό της κλάσης

• Κάνει τη συνάρτηση "in-line"

• Ξανά: χρήση µόνο για µικρές συναρτήσεις

• Πιο αποδοτικά– Εάν είναι πολύ µεγάλη είναι λιγότερο αποδοτική!

Page 33: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

33

Static Μέλη• Static µεταβλητές-µέλη

– Όλα τα αντικείµενα της κλάσης “µοιράζονται” ένα αντίγραφο

– Όταν τροποποιείται η µεταβλητή αυτή από ένα αντικείµενο όλα τα αντικείµενα της κλάσης βλέπουν την αλλαγή

– Αρχικοποιούνται εκτός κλάσης

• Χρήσιµο για “ιχνηλάτηση”– Πόσο συχνά καλείται µια συνάρτηση-µέλος– Πόσα αντικείµενα της κλάσης υπάρχουν σε µια δεδοµένη στιγµή

• Τοποθετήστε τη λέξη-κλειδί static πριν τον τύπο δεδοµένων

Page 34: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

34

Συναρτήσεις Static• Οι συναρτήσεις-µέλη µπορεί και αυτές να είναι static

– Εάν δεν χρειάζεται προσπέλαση στα δεδοµένα του αντικειµένου

– Και πρέπει να είναι µέλος της κλάσης– Την κάνουµε συνάρτηση static

• Μπορεί να κληθεί εκτός της κλάσης– Από αντικείµενα που δεν ανήκουν στην κλάση:

• Π.χ., Server::getTurn();– Καθώς και από αντικείµενα της κλάσης

• Συνήθης µέθοδος: myObject.getTurn();

• Μπορούν να χρησιµοποιούν µόνο τα static δεδοµένα, και συναρτήσεις!

Page 35: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

35

Παράδειγµα Static Μελών (1/4)

Page 36: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

36

Παράδειγµα Static Μελών (2/4)

Page 37: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

37

Παράδειγµα Static Μελών (3/4)

Page 38: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

38

Παράδειγµα Static Μελών (4/4)

Page 39: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

39

Η κλάση Vector της STL

• Εισαγωγή στην κλάση Vector– Θυµηθείτε: οι πίνακες έχουν σταθερό µέγεθος

– Vectors: “πίνακες που µικραίνουν και µεγαλώνουν” κατά την εκτέλεση του προγράµµατος

– Προέρχονται από την Standard Template Library (STL)

Page 40: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

40

Τα βασικά για την κλάση Vector

• Όµοια µε τους πίνακες:– Έχει “βασικό τύπο”– Αποθηκεύει συλλογή από τιµές του βασικού τύπου

• ∆ηλώνεται διαφορετικά:– Σύνταξη: vector<Base_Type>

• Προσδιορίζει µια template class• Οποιοσδήποτε τύπος µπορεί να αποτελέσει το Base_Type• Παράγει µια νέα κλάση για διανύσµατα αυτού του τύπου

– Παράδειγµα δήλωσης:vector<int> v;

Page 41: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

41

Χρήση του Vector

• vector<int> v;– “v είναι ένα vector τύπου int”– Καλεί τον default constructor της κλάσης

• ∆ηµιουργείται ένα κενό vector

• Υποστηρίζουν δεικτοδότηση για την προσπέλαση όπως και οι πίνακες

• Αλλά για την προσθήκη στοιχείων:– Πρέπει να κληθεί η συνάρτηση-µέλος push_back

• Συνάρτηση-µέλος size()– Επιστρέφει τον τρέχοντα αριθµό των στοιχείων του

vector

Page 42: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

42

Παράδειγµα του Vector (1/2)

Page 43: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

43

Παράδειγµα του Vector (2/2)

Page 44: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

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

Page 45: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

45

Περίληψη (1/2)

• Constructors: αυτόµατη αρχικοποίηση των αντικειµένων– Καλούνται όταν δηλώνονται τα αντικείµενα– Ο Constructor έχει το ίδιο όνοµα µε την κλάση

• Ο Default constructor δεν έχει παραµέτρους– Πάντα θα πρέπει να τον ορίζουµε

• Μεταβλητές-µέλη της class– Μπορεί να είναι αντικείµενα άλλης κλάσης

• Απαιτούν τµήµα-αρχικοποίησης

Page 46: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

46

Περίληψη (2/2)

• Constant call-by-reference παράµετροι– Πιο αποδοτικά σε σχέση µε τις call-by-value

• Μπορούµε να κάνουµε inline πολύ µικρούς ορισµούς συναρτήσεων– Βελτιώνουν την αποτελεσµατικότητα

• Static µεταβλητές-µέλη– Κοινές για όλα τα αντικείµενα της κλάσης

• Κλάσεις Vector– Όπως: “πίνακες που µεγαλώνουν και µικραίνουν δυναµικά”

Page 47: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

47

Περιεχόµενα

• Constructors• Overloading τελεστών• Φίλιες συναρτήσεις/κλάσεις• ∆υναµική δηµιουργία αντικειµένων

Page 48: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

48

Στόχοι εκµάθησης

• Βασικός µηχανισµός overloading τελεστών– Μοναδιαίοι τελεστές– Ως συναρτήσεις-µέλη

• Friends και αυτόµατη µετατροπή τύπων– Συναρτήσεις friend, κλάσεις friend– Constructors για αυτόµατη µετατροπή τύπων

• References και overloading– << και >>– Τελεστές: = , [], ++, --

Page 49: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

49

Υπερφόρτωση Τελεστών (1/2)

• Τελεστές +, -, %, ==, etc.– Είναι και αυτοί συναρτήσεις!

• Απλά καλούνται µε διαφορετική σύνταξη: x + 7 – "+" είναι δυαδικός τελεστής µε x και 7 ως τελεστέους

• ∆είτε το ως εξής:+(x, 7)– "+" είναι το όνοµα της συνάρτησης– x, 7 είναι τα ορίσµατα– Η συνάρτηση "+" επιστρέφει το άθροισµα των ορισµάτων της

Page 50: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

50

Υπερφόρτωση Τελεστών (2/2)

• Ενσωµατωµένοι τελεστές– π.χ., +, -, = , %, ==, /, *– Λειτουργούν ήδη στη C++ για built-in τύπους– Στο συνήθη δυαδικό συµβολισµό

• Μπορούµε να τους υπερφορτώσουµε!– Για να λειτουργούν µε τους δικούς µας τύπους!– Για να προσθέσουµε "Chair types", ή "Money types"

• Όπως µας εξυπηρετεί

• Πάντοτε υπερφορτώνουµε για “παρόµοιες”λειτουργίες!

Page 51: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

51

Τα βασικά της υπερφόρτωσης

• Υπερφόρτωση τελεστών– ΠΟΛΥ όµοιο µε την υπερφόρτωση συναρτήσεων– Ο τελεστής παίζει το όνοµα της συνάρτησης

• Παράδειγµα δήλωσης:const Money operator +(const Money& amount1, const Money& amount2);

– Υπερφορτώνει το + για τελεστέους τύπου Money– Χρησιµοποιεί const παραµέτρους µε αναφορά για εποδοτικότητα

– Η επιστρεφόµενη τιµή είναι τύπου Money• Επιτρέπει πρόσθεση αντικειµένων "Money"

Page 52: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

52

Ορισµός “+” για Money

Page 53: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

53

Υπερφόρτωση “==”

• Τελεστής ισότητας, ==– Επιτρέπει σύγκριση αντικειµένων τύπου

Money– ∆ήλωση:

bool operator ==(const Money& amount1,const Money& amount2);

• Επιστρέφει τύπο bool type για ισότητα true/false– ∆εν είναι συνάρτηση-µέλος

(όπως δεν είναι και ο τελεστής “+”)

Page 54: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

54

Ορισµός “==” για Money

Page 55: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

55Constructors που επιστρέφουν αντικείµενα

• Ο Constructor είναι µια "void" συνάρτηση?– Τον αντιµετωπίζουµε ως τέτοιο, αλλά δεν είναι– Είναι µια “ειδικού τύπου” συνάρτηση

• Με ξεχωριστές ιδιότητες• ΜΠΟΡΕΙ να επιστρέφει µια τιµή!

• Θυµηθείτε τη δήλωση return στην υπερφόρτωση του "+" για τύπους Money:– return Money(finalDollars, finalCents);

• Επιστρέφει ένα στιγµιότυπο της κλάσης Money!• Έτσι, ο constructor στην πραγµατικότητα “επιστέφει” ένα αντικείµενο!

• Αποκαλείται “ανώνυµο αντικείµενο”

Page 56: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

56

Επιστροφή µιας const τιµής

• Θεωρήστε ξανά τον τελεστή "+":const Money operator +(const Money& amount1,

const Money& amount2);

– Επιστρέφει ένα “const αντικείµενο”?– Γιατί?

• ∆είτε την επίπτωση του να επιστρέψουµε ένα “non-const” αντικείµενο για να το αντιληφθείτε …

Page 57: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

57

Επιστροφή µιας non-const τιµής

• Θεωρήστε “no const” στη δήλωση:Money operator +( const Money& amount1,

const Money& amount2);

• Θεωρήστε την έκφραση που καλεί:m1 + m2– Όπου τα m1 και m2 είναι αντικείµενα τύπου Money– Το αντικείµενο που επιστρέφεται είναι τύπου Money– Μπορούµε να κάνουµε διάφορα πράγµατα µε τα αντικείµενα!

• Όπως για παράδειγµα, να καλέσουµε τις συναρτήσεις-µέλη τους …

Page 58: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

58Τι µπορούµε να κάνουµε µε non-const αντικείµενα

• Μπορούµε να καλέσουµε συναρτήσεις-µέλη:– Να εκτελέσουµε τις συναρτήσεις-µέλη του αντικειµένου που επιστρέφεται από την πράξη m1+m2:

• (m1+m2).output(); //Νόµιµο– ∆εν υπάρχει πρόβληµα, τίποτε δεν αλλάζει

• (m1+m2).input(); //ΝΟΜΙΜΟ!– ΠΡΟΒΛΗΜΑ! //Νόµιµο, αλλά ΤΡΟΠΟΠΟΙΕΙ κάτι!

• Επιτρέπει τροποποίηση ενός ανώνυµου αντικειµένου!• ∆εν µπρούµε να το επιτρέψουµε!

• Συνεπώς ορίσουµε το αντικείµενο επιστροφής να είναι const

Page 59: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

59

Υπερφόρτωση µοναδιαίων τελεστών

• Η C++ έχει µοναδιαίους τελεστές:– Ορίζονται ως να δέχονται έναν τελεστέο– π.χ., - (άρνηση)

• x = -y; // Θέτει το x ίσο µε το αρνητικό του y

– Άλλοι µοναδιαίοι τελεστές:• ++, --

• Οι µοναδιαίοι τελεστές µπορούν επίσης να υπερφορτωθούν

Page 60: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

60

Υπερφόρτωση του “-” για Money

• ∆ήλωση υπερφόρτωσης του “-”– Τοποθετείται εκτός δήλωση της κλάσης:

const Money operator –(const Money& amount);– Σηµειώστε: δέχεται µόνο ένα όρισµα

• Ο τελεστής "-" υπερφορτώνεται δύο φορές!– Για δυο τελεστέους/ορίσµατα (δυαδικός)– Για έναν τελεστέο/όρισµα (µοναδιαίος)– Πρέπει να υπάρχουν ορισµοί και για τις δυο περιπτώσεις

Page 61: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

61

Overloaded "-" Definition

• Ορισµός υπερφόρτωσης "-":const Money operator –(const Money& amount)

return Money(-amount.getDollars(), -amount.getCents());

• Εφαρµόζει τον µοναδιαίο τελεστή “-” σε built-inτύπους, για τους οποίους η πράξη είναι γνωστή

• Επιστρέφει ανώνυµο αντικείµενο

Page 62: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

62

Χρήση υπερφορτωµένου "-"

• Θεωρήστε το:Money amount1(10),

amount2(6),amount3;

amount3 = amount1 – amount2;• Καλεί τον δυαδικό υπερφορτωµένο "-"

amount3.output(); //Αποτέλεσµα $4.00amount3 = -amount1;

• Καλεί τον µοναδιαίο υπερφορτωµένο "-"

amount3.output() // Αποτέλεσµα -$10.00

Page 63: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

63Υπερφορτωµένοι τελεστές ως συναρτήσεις-µέλη

• Στα προηγούµενα παραδείγµα: “ανεξάρτητες”συναρτήσεις– Ορισµένες έξω από κλάσεις

• Μπορεί να γίνει υπερφόρτωση ως "member operator"– Θεωρείται συνάρτηση-µέλος όπως και οι υπόλοιπες

Όταν ο τελεστής είναι συνάρτηση-µέλος:– Μόνο ΜΙΑ παράµετρος, όχι δυο!– Το καλούν αντικείµενο λειτουργεί ως 1st παράµετρος

Page 64: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

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);– Σηµειώστε το µοναδικό όρισµα του τελεστή

Page 65: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

65

Συναρτήσεις const

• Πότε να κάνουµε µια συνάρτηση const?– Οι constant συναρτήσεις δεν επιτρέπεται να τροποποιούν τα δεδοµένα-µέλη της κλάσης

– Τα const objects µπορούν να καλούν ΜΟΝΟ constantσυναρτήσεις-µέλη

• Το καλό στυλ απαιτεί:– Κάθε συνάρτηση-µέλος που δεν πρόκειται να τροποποιήσει τα δεδοµένα θα πρέπει να δηλώνεται ως const

• Χρήση της λέξης-κλειδί const µετά τη δήλωση της συνάρτησης και στο heading της

Page 66: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

66

Υπερφόρτωση Κλήσης Συνάρτησης ()

• Τελεστής κλήσης συνάρτησης, ( )– Πρέπει να υπερφορτωθεί ως συνάρτηση-µέλος– Επιτρέπει τη χρήση των αντικειµένων όπως µια τυπική συνάρτηση

– Μπορεί να υπερφορτωθεί για όλους τους πιθανούς αριθµούς ορισµάτων

• Παράδειγµα:Aclass anObject;anObject(42);

• Εάν υπερφορτωθεί ο ( ) καλεί την υπερφορτωµένη “έκδοση”

Page 67: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

67

Άλλες υπερφορτώσεις

• &&, ||, και τελεστής comma– Οι προκαθορισµένες εκδόσεις τους δουλεύουν για boolτύπους

– Θυµηθείτε: χρησιµοποιούν την “short-circuit εκτίµηση”– Όταν υπερφορτωθούν, δεν την χρησιµοποιούν πλέον

• Χρησιµοποιούν την “πλήρη εκτίµηση”

• Γενικώς, θα πρέπει να αποφεύγουµε την υπερφόρτωσή τους

Page 68: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

68

Συναρτήσεις Friend (1/2)

• ∆εν είναι συναρτήσεις-µέλη– Θυµηθείτε: υπερφόρτωση τελεστών ως µη συναρτήσεις-µέλη

• Προσπελάζουν τα δεδοµένα διαµέσου συναρτήσεων accessor και mutator

• Πολύ αναποτελεσµατικό (κόστος στις κλήσεις)

• Οι Friends µπορούν να προσπελάσουν άµεσα τα ιδιωτικά δεδοµένα της κλάσης– ∆εν υπάρχει κόστος, είναι πιο αποτελεσµατικό

• Συνεπώς: το καλύτερο είναι να κάνουµε friendsτις nonmember operator υπερφορτώσεις!

Page 69: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

69

Συναρτήσεις Friend (1/2)

• Συναρτήσεις Friend µιας κλάσης– ∆εν είναι συνάρτηση-µέλος– Έχει άµεση πρόσβαση στα ιδιωτικά δεδοµένα της κλάσης

• Όπως και οι συναρτήσεις-µέλη της κλάσης

• Χρήση της λέξης-κλειδί friend πριν από τη δήλωση της συνάρτησης– Καθορίζεται ΜΕΣΑ στον ορισµό της κλάσης– ∆εν είναι όµως συναρτήσεις-µέλη της κλάσης!

Page 70: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

70

Χρήση συναρτήσεων Friend

• Υπερφόρτωση τελεστών– Είναι η πιο κοινή χρήση των friends

– Βελτιώνει την αποδοτικότητα

– Αποφεύγει την ανάγκη κλήσης συναρτήσεων-µελών accessor/mutator

• Friend µπορεί να είναι οποιαδήποτε συνάρτηση

Page 71: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

71

Αναγκαιότητα συναρτήσεων Friend

• Οι Friend είναι “καθαρές”?– To “πνεύµα” του OOP επιβάλλει όλοι οι τελεστές και οι συναρτήσεις να είναι µέλη της κλάσης

– Πιστεύεται ότι οι friends παραβιάζουν τις βασικές αρχές του OOP

• Έχουν πλεονεκτήµατα?– Για τους τελεστές: πάρα πολλά!– Επιτρέπουν αυτόµατα µετατροπή τύπων– Υποστηρίζουν την ενθυλάκωση: οι friends είναι µέσα σε κάποιον ορισµό κλάσης

– Βελτιώνουν την απόδοση

Page 72: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

72

Κλάσεις Friend

• Ολόκληρες κλάσεις µπορεί να είναι friends– Όοµοια µε τις συναρτήσεις που είναι friend σε µια κλάση

– Παράδειγµα:class F is friend of class C

• Όλες οι συναρτήσεις-µέλη της κλάσης F είναι friends της κλάσης C

• H friend-ship δεν αίρεται

• Σύνταξη: friend class F;– Μπαίνει µέσα στον ορισµό της κλάσης, η οποία δίνει την “εξουσιοδότηση” στην F

Page 73: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

73

Αναφορές (References)

• Αναφορά (Reference) ορίζεται ως:– Όνοµα µιας θέσης αποθήκευσης– Παρόµοια µε το δείκτη

• Παράδειγµα µιας stand alone reference:– int robert;

int& bob = robert;• bob είναι αναφορά στη θέσης αποθήκευσης του robert• Οι αλλαγές στο bob θα επηρρεάσουν το robert

Page 74: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

74

Χρήση Αναφορών

• Είναι σχετικά επικίνδυνες

• Χρήσιµες σε µερικές περιπτώσεις:

• Call-by-reference– Συχνά χρησιµοποιείται για την υλοποίηση του

µηχανισµού αυτού

• Επιστρέφοντας µια αναφορά– Επιτρέπει υλοποιήσεις υπερφόρτωσης τελεστών να γραφούν πιο “φυσικά”

– Σκεφτείτε το ως επιστροφή ενός "alias" σε µια µεταβλητή

Page 75: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

75

Επιστροφή Αναφορών

• Σύνταξη:double& sampleFunction(double& variable);– double& and double are different– Πρέπει να ταιριάζουν στη δήλωση και στο

heading της συνάρτησης

• Το επιστρεφόµενο item πρέπει να έχει µια αναφορά– Όπως µια µεταβλητή αυτού του τύπου– ∆εν µπορεί να είναι εκφράσεις όπως: "x+5"

• ∆εν υπάρχει µέρος στη µνήµη στο οποίο να αναφερθεί

Page 76: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

76

Παράδειγµα επιστροφής αναφοράς

• Παράδειγµα ορισµού συνάρτησης:double& sampleFunction(double& variable)

return variable;

• Απλό παράδειγµα επίδειξης των εννοιών

• Κύρια χρήση:– Σε µερικούς υπερφορτωµένους τελεστές

Page 77: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

77

Υπερφόρτωση των >> και <<

• Επιτρέπει είσοδο και έξοδο των αντικειµένων που φτιάχνουµε– Παρόµοια µε την υπερφόρτωση των άλλων τελεστών

• Βελτιώνει την αναγνωσιµότητα των προγραµµάτων– Επιτρέπει:

cout << myObject;cin >> myObject;

– Αντί για την ανάγκη να γράφουµε:myObject.output(); …

Page 78: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

78

Υπερφόρτωση <<

• Τελεστής <<– Χρησιµοποιείται µε cout– Είναι δυαδικός τελεστής

• Παράδειγµα:cout << "Hello";– Ο τελεστής είναι ο <<– Ο 1ος τελεστέος είναι το προκαθορισµένο αντικείµενο cout

• Από τη βιβλιοθήκη iostream

– Ο 2ος τελεστέος είναι το αλφαριθµητικό "Hello"

Page 79: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

79

Υπερφόρτωση <<

• Τελεστέοι του <<– Το αντικείµενο cout, της κλασης ostream– Η δική µας κλάση

• Θυµηθείτε την κλάση Money– Χρησιµοποιούσε τη συνάρτηση-µέλος output()– Θα ήταν προτιµότερο να χρησιµοποιούσαµε τον τελεστή <<:

Money amount(100);cout << "I have " << amount << endl;

αντί για το:cout << "I have ";amount.output();

Page 80: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

80

Τιµή επιστροφής υπερφορτωµένου >>

• Money amount(100);cout << amount;– Ο τελεστής << πρέπει να επιστρέφει κάποια τιµή– Για να επιτρέψουµε “διαδοχικά” ορίσµατα:

cout << "I have " << amount;(cout << "I have ") << amount;

• Τα παραπάνω είναι ισοδύναµα

• Τι επιστρέφει?– cout object!

• Επιστρέφει αντικείµενο κλάσης του πρώτου ορίσµατος, ostream

Page 81: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

81

Παρ. υπερφόρτωσης << και >> (1/5)

Page 82: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

82

Παρ. υπερφόρτωσης << και >> (2/5)

Page 83: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

83

Παρ. υπερφόρτωσης << και >> (3/5)

Page 84: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

84

Παρ. υπερφόρτωσης << και >> (4/5)

Page 85: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

85

Παρ. υπερφόρτωσης << και >> (5/5)

Page 86: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

86

Τελεστής ανάθεσης, =

• Θα πρέπει να υπερφορτωθεί ως member operator• Υπερφορτώνεται αυτόµατα

– Εξ’ ορισµού τελεστής ανάθεσης:• Αντιγραφή µελος-προς-µέλος• Μεταβλητές-µέλη ενός αντικειµένου στις αντίστοιχες µεταβλητές-µέλη του άλλου αντικειµένου

• Η εξ’ ορισµού συµπεριφορά είναι OK για απλές κλάσεις– Αλλά για δείκτες πρέπει να γράψουµε τον δικό

µας τελεστή ανάθεσης!

Page 87: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

87

Increment και Decrement• Κάθε τελεστής έχει δυο “εκδόσεις”

– Προθεµατικός τελεστής: ++x;– Μεταθεµατικός τελεστής: x++;

• Πρέπει να γίνει η διάκριση στην υπερφόρτωση– Τυπικά υπερφορτώνεται η προθεµατική έκδοση– Προσθέτουµε 2ο παράµετρο τύπου intΜεταθεµατική

• Απλά ένα σύµβολο για τον compiler!

Page 88: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

88

Υπερφόρτωση τελεστή πίνακα, [ ]

• Μπορούµε να υπερφορτώσουµε τον [ ]– Για να χρησιµοποιείται για αντικείµενα των κλάσεων που ορίζουµε

–Ο τελεστής πρέπει να επιστρέφει µια αναφορά!

–Ο τελεστής [ ] πρέπει να είναι συνάρτηση-µέλος!

Page 89: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

89

Περίληψη (1/2)

• Οι built-in τελεστές της C++ µπορούν να υπερφορτωθούν για να λειτουργήσουν για τις δικές µας κλάσεις

• Οι τελεστές είναι απλά συναρτήσεις

• Οι συναρτήσεις friend έχουν άµεση πρόσβαση στα ιδιωτικά δεδοµένα των κλάσεων

• Οι τελεστές µπορούν να υπερφορτωθούν ως συναρτήσεις µέλη– Ο 1ος τελεστέος είναι το καλούν αντικείµενο

Page 90: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

90

Περίληψη (2/2)

• Οι συναρτήσεις friend απλά προσθέτουν αποδοτικότητα– ∆εν χρειάζονται, εάν υπάρχουν αρκετές συναρτήσεις

accessors/mutators

• Οι αναφορές “ονοµατίζουν” µια µεταβητή µε ένα alias

• Μπορούµε να υπερφορτώσουµε τους << και >>– Ο τύπος επιστροφής είναι µια αναφορά σε τύπο stream

Page 91: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

91

Περιεχόµενα

• Constructors• Overloading τελεστών• Φίλιες συναρτήσεις/κλάσεις• ∆υναµική δηµιουργία αντικειµένων

Page 92: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

92

Πίσω στις κλάσεις• Ο τελεστής ->

– Σύντοµος συµβολισµός

• Συνδυάζει τους τελεστές: dereference (*) και dot (.)

• Καθορίζει το µέλος της κλάσης που δείχνεται από τον συγκεκριµένο δείκτη

• Παράδειγµα:MyClass *p;p = new MyClass;p->grade = "A"; //Equivalent to:(*p).grade = "A";

Page 93: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

93

Ο δείκτης this• Οι ορισµοί των συναρτήσεων-µελών πολλές φορές χρειάζεται να αναφέρονται στο καλούν αντικείµενο

• Χρήση του προκαθορισµένου δείκτη this– Αυτόµατα δείχνει στο καλούν αντικείµενο:

Class Simplepublic:

void showStuff() const;private:

int stuff;;

• Οι συναρτήσεις-µέλη µπορούν να χρησιµοποιούν οποιονδήποτε από τα παρακάτω για προσπέλαση:cout << stuff;cout << this->stuff;

Page 94: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

94

Υπερφόρτωση τελεστή ανάθεσης (1/2)

• Ο τελεστής ανάθεσης επιστρέφει αναφορά– ΄Έτσι ώστε “αλυσίδες” αναθέσεων να είναι πιθανές

– π.χ., a = b = c;• Θέτει τα a και b ίσα µε το c

• Ο τελεστής πρέπει να επιστρέφει “ίδιο τύπο” µε αυτόν αριστερά του– Για να επιτρέψει τις “αλυσίδες”– Ο δείκτης this βοηθάει σ’ αυτό!

Page 95: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

95

Υπερφόρτωση τελεστή ανάθεσης (2/2)

• Θυµηθείτε: Ο τελεστής ανάθεσης πρέπει να είναι µέλος της κλάσης– Έχει µόνο µια παράµετρο– Ο αριστερός τελεστέος είναι το καλούν αντικείµενο

s1 = s2;

• Σκεφτείται το ως εξής: s1.=(s2);

• s1 = s2 = s3;– Απαιτεί (s1 = s2) = s3;– Έτσι το (s1 = s2) πρέπει να επιστρέφει αντικείµενο του ίδιου τύπου µε τον τύπο του s1

• Και να το περάσει στο “ = s3”;

Page 96: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

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;

Page 97: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

97

“Ρηχά” και “βαθιά” αντίγραφα

• “Ρηχό” αντίγραφο– Η ανάθεση αντιγράφει µόνο τα περιεχόµενα των

µεταβλητών-µελών– Η εξ’ ορισµού ανάθεση και ο copy constructor

• “Βαθύ” αντίγραφο– ∆είκτες, εµπλέκεται δυναµική µνήµη– Πρέπει να βρούµε πού δείχνει ο δείκτης για να πάρουµε τα δεδοµένα του για αντιγραφή

– Γράψτε το δικό σας τελεστή ανάθεσης και copy constructor για τις περιπτώσεις αυτές!

Page 98: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

98

Η ανάγκη για destructor• ∆υναµικά δεσµευµένες µεταβλητές

– ∆εν εξαλείφονται µέχρι να “διαγραφούν”• Εάν οι δείκτες είναι δηµόσια δεδοµένα της κλάσης

– Την αποδέσµευση µπορεί να την κάνουν άλλες “εξωτερικές της κλάσης” συναρτήσεις

• Εάν οι δείκτες είναι ιδιωτικά µόνο δεδοµένα της κλάσης– ∆υναµικά δεσµεύουν “πραγµατικά” δεδοµένα

• Στον constructor– Πρέπει να υπάρχει τρόπος για να τα “αποδεσµεύσουµε”όταν καταστραφεί το αντικείµενο

• Απάντηση: ο destructor!

Page 99: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

99

Destructor

• Η αντίθετη έννοια του constructor– Καλείται αυτόµατα όταν το αντικείµενο βρεθεί “out-of-

scope”– Η εξ’ ορισµού έκδοση καταστρέφει µόνο τις συνήθεις

µεταβλητές και όχι τις δυναµικές

• Ορίζεται όπως ο constructor, αλλά προσθέτουµε το tilde ~– MyClass::~MyClass()

//Perform delete clean-up duties

Page 100: Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming …delab.csd.auth.gr/~dimitris/courses/cpp_fall05/lectures/cpp_fall05_le… · • Υποστηρίζουν

16/11/2005 Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ∆ικτύων, Πανεπιστήµιο Θεσσαλίας

100

Copy Constructors• Καλούνται αυτόµατα όταν:

1. ∆ηλώνεται ένα αντικείµενο κλάσης και αρχικοποιείται σε κάποιο άλλο αντικείµενο

2. Όταν µια συνάρτηση επιστρέφει αντικείµενο3. Όταν όρισµα τύπου κλάσης περνάει ως πραγµατικό όρισµα

σε µια κλήση-µε-τιµή

• Απαιτεί “προσωρινό αντίγραφο” του αντικειµένου– Ο copy constructor το δηµιουργεί

• Εξ’ ορισµού copy constructor– Όπως και ο εξ’ ορισµού τελεστής ανάθεσης "=", εκτελεί

αντιγραφή µέλος-προς-µέλος

• ∆είκτες γράψτε το δικό του copy constructor!