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

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

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

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

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

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

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

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Πίνακες.

Κλάσεις και αντικείμενα #include <iostream.h<

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλάσεις και Αντικείµενα

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Υπερφόρτωση τελεστών

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Αντικειμενοστρεφής Προγραμματισμός

Τελεστές ΤΕΛΕΣΤΕΣ. Γεώργιος Παπαϊωάννου ( )

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Υπερφόρτωση Τελεστών

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Αντικειμενοστραφής Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

17TimeThis.h function returns reference pointer to same object { return *this; }

Στοιχειώδης προγραμματισμός σε C++

12. ΑΛΦΑΡΙΘΜΗΤΙΚΑ. υο είδη αλφαριθµητικών Τα αλφαριθµητικά της C πίνακες τύπου char Ta αντικείµενα της κλάσης string

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Προγραμματισμός Υπολογιστών με C++

ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. ΕΡΓΑΣΤΗΡΙΟ C++ ΕΞΑΜΗΝΟ Γ Ακαδηµαϊκό Έτος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

Οντοκεντρικός Προγραμματισμός

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Προγραμματισμός Υπολογιστών με C++

Δομημένος Προγραμματισμός

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αναφορές, είκτες και Αλφαριθμητικά

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

5. ΣΥΝΑΡΤΗΣΕΙΣ. (Πρόχειρο σχέδιο - Μαθήµατος 3) p Συναρτήσεις, που δεν επιστρέφουν κάποια τιµή

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Προγραμματισμός Ι (ΗΥ120)

3 Αλληλεπίδραση Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Αλφαριθµητικά Κλάση string

Αντικειµενοστρεφής Προγραµµατισµός

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++

Εισαγωγή στον Προγραμματισμό

Αντικειμενοστρεφής Προγραμματισμός

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

Τι είναι κλάση Κλάση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Υπερφόρτωση τελεστών (operator(

ΗΥ-150. Προγραμματισμός

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

ΗΥ-150. Προγραμματισμός

Οντοκεντρικός Προγραμματισμός

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

a = 10; a = k; int a,b,c; a = b = c = 10;

Εισαγωγή στον Προγραμματισμό με C++

είκτες και Πίνακες (2)

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Δεδομένα, τελεστές, είσοδος/έξοδος

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Ερωτήσεις και απαντήσεις στα θέματα του κανονισμού κατάρτισης

Συναρτήσεις και διαδικασίες

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors, equals, tostring Αντικείμενα ως παράμετροι

Δομημένος Προγραμματισμός (ΤΛ1006)

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Transcript:

1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 6η

2 Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα τοποθετούνται οι διαφάνειες του επόµενου µαθήµατος Επικοινωνία: dimitris@skyblue.csd.auth.gr

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

4 Στόχοι εκµάθησης Constructors Ορισµοί Κλήση Εργαλεία const parameter modifier Inline συναρτήσεις Static µεταβλητές-µέλη Vectors Εισαγωγή στην κλάση vector

5 Constructors Αρχικοποίηση των αντικειµένων Αρχικοποίηση µερικών ή όλων των µεταβλητών που είναι µέλη του αντικειµένου Επιπρόσθετες λειτουργίες είναι δυνατές Είναι ειδική περίπτωση συνάρτησης-µέλους Καλέιται αυτόµατα όταν δηλώνεται το αντικείµενο Πολύ χρήσιµα εργαλεία Στηρίζουν τις αρχές του OOP

6 Ορισµοί Constructor Οι constructors ορίζονται όπως κάθε άλλη συνάρτηση-µέλος Εκτός από το ότι: 1. Πρέπει να έχουν το ίδιο όνοµα µε την κλάση τους 2. εν επιστρέφουν τιµή; Ούτε δηλώνονται ως void!

7 Παράδειγµα ορισµού Constructor Ορισµός κλάσης µε constructor: class DayOfYear { public: DayOfYear(int monthvalue, int dayvalue); //Constructor initializes month & day void input(); void output(); private: int month; int day; }

8 Χρήσιµες παρατηρήσεις Παρατηρήστε το όνοµα του constructor: DayOfYear Ίδιο µε το όνοµα της κλάσης του! Η δήλωση του Constructor δεν έχει τύπο επιστροφής Ούτε void! Ο Constructor τοποθετείται στο τµήµα public Καλείται όταν δηλώνονται τα αντικείµενα Εάν δηλωθεί ως private, δεν θα µπορούµε να δηλώσουµε αντικείµενα!

9 Κλήση των Constructors ήλωση αντικειµένων: DayOfYear date1(7, 4), date2(5, 5); Τα αντικείµενα δηµιουργούνται εδώ Καλείται ο Constructor Οι τιµές στις παρενθέσεις περνιούνται ως ορίσµατα στον constructor Οι µεταβλητές-µέλη month, day αρχικοποιούνται: date1.month 7 date2.month 5 date1.dat 4 date2.day 5

10 Ισοδυναµία Constructor Θεωρήστε: DayOfYear date1, date2 date1.dayofyear(7, 4); // ILLEGAL! date2.dayofyear(5, 5); // ILLEGAL! Με πρώτη µατιά OK ΕΝ ΕΠΙΤΡΕΠΕΤΑΙ να καλούµε τους constructors όπως τις άλλες συναρτήσεις-µέλη!

11 Κώδικας Constructor Ο ορισµός ενός Constructor είναι ίδιος µε αυτόν των άλλων συναρτήσεων-µελών: DayOfYear::DayOfYear(int monthvalue, int dayvalue) { month = monthvalue; day = dayvalue; } Παρατηρήστε το ίδιο όνοµα γύρω από τα :: Προσδιορίζει έναν constructor εν υπάρχει τύπος επιστροφής

12 Εναλλακτικός ορισµός Ο προηγούµενος ορισµός είναι ιδσοδύναµος µε: DayOfYear::DayOfYear( int monthvalue, int dayvalue ) : month(monthvalue), day(dayvalue) { } Η τρίτη γραµµή ονοµάζεται Τµήµα αρχικοποίησης Το σώµα µένει κενό

13 Άλλος ένας σκοπός του Constructor Όχι απλώς να αρχικοποιήσει τα δεδοµένα Το σώµα δεν χρειάζεται να είναι κενό Ελέγξει την εγκυρότητα των δεδοµένων! Να επιβεβαιώσει ότι µόνο έγκυρες τιµές ανατίθενται στις ιδιωτικές µεταβλητές της κλάσης Ισχυρή αρχή του OOP

14 Overloaded Constructors Μπορούµε να κάνουµε overload τους constructors όπως και τις απλές συναρτήσεις Θυµηθείτε: µια υπογραφή (signature)αποτελείται από: Όνοµα της συνάρτησης Λίστα παραµέτρων Να παρέχουµε constructors για όλες τις πιθανές λίστες ορισµάτων

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

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

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

18 Constructor χωρίς ορίσµατα Προκαλεί σύγχυση µε απλές συναρτήσεις χωρίς ορίσµατα: Καλούνται µε την εξής σύνταξη: callmyfunction(); Με τις κενές παρανθέσεις ηλώσεις αντικειµένων χωρίς αρχικοποίηση: DayOfYear date1; // Ορθό! DayOfYear date(); // ΛΑΘΟΣ!

19 Ρητές κλήσεις στον Constructor Μπορούµε να καλέσουµε τον constructor ΞΑΝΑ, µετά τη δήλωση του αντικειµένου Θυµηθείτε: στην περίπτωση εκείνη ο constructor κλήθηκε αυτόµατα Τον καλούµε µε τον όνοµα του αντικειµένου; Τυπική κλήση συνάρτησης-µέλους Εύκολος τρόπος για να θέτουµε τιµές στις µεταβλητές-µέλη Μέθοδος αρκετά διαφορετική από την τυπική κλήση συνάρτησης-µέλους

20 Παράδ. ρητής κλήσης Constructor Μια τέτοια κλήση επιστρέφει ένα ανώνυµο αντικείµενο Το οποίο µπορεί κατόπιν να αντεθεί Στην πράξη: DayOfYear holiday(7, 4); Ο Constructor καλείται στη δήλωση του αντικειµένου Τώρα για επαν-αρχικοποίηση : holiday = DayOfYear(5, 5); Ρήτη κλήση constructor Επιστρέφει ανώνυµο αντικείµενο Ανατίθεται ξανά στο υπάρχον αντικείµενο

21 Default Constructor Ορίζεται ως : constructor χωρίς ορίσµατα Πάντα πρέπει να ορίζουµε κάποιον Αυτό-δηµιουργειται? ΝΑΙ & ΌΧΙ Εάν δεν έχει οριστεί ΚΑΝΕΝΑΣ constructor ΝΑΙ Εάν έχει οριστεί κάποιος ΌΧΙ Εάν δεν υπάρχει default constructor: εν µπορούµε να δηλώσουµε το: MyClass myobject; Χωρίς αρχικοποιητές

22 Μεταβλητές-µέλη τύπου κλάσης Οι µεταβλητές-µέλη µιας κλάσης µπορεί να είναι οποιουδήποτε τύπου Ακόµα και αντικείµενα άλλων κλάσεων! Στην περίπτωση αυτή χρειαζόµαστε ειδική σύνταξη για τους constructors Ώστε να µπορούν να καλέσουν τον constructor του αντικειµένου-µέλους τους

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

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

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

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

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

28 Μέθοδοι περάσµατος παραµέτρων Αποδοτικότητα µεθόδων περάσµατος παραµέτρων Call-by-value Απαιτεί δηµιουργία αντιγράφου Κόστος Call-by-reference έσµευση θέσης (Placeholder) για το πραγµατικό όρισµα Η πιο αποδοτική µέθοδος Αµελητέα διαφορά για τους βασικούς τύπους Για κλάσεις/αντικείµενα καθαρό πλεονέκτηµα Call-by-reference είναι επιθυµητό Ειδικά για µεγάλους τύπους δεδοµένων, όπως κλάσεις

29 Ο const parameter modifier Μεγάλοι τύποι δεδοµένων (τυπικά κλάσεις) Επιθυµητό να χρησιµοποιούµε pass-by-reference Ακόµα και εάν η συνάρτηση δεν πρόκειται να κάνει τροποποιήσεις Προστασία ορίσµατος Χρήση του προσδιοριστή constant Αποκαλείται επίσης constant call-by-reference παράµετρος Τοποθετείστε τη λέξη-κλειδί const πριν τον τύπο Κάνει το όρισµα να είναι "read-only" Προσπάθεια τροποποίησής του προκαλεί compiler error

30 Χρήση του const Εάν δεν χρειάζονται τροποποιήσεις Προστασία των παραµέτρων µε την const Προστασία όλων αυτών των παραµέτρων Αυτό περιλαµβάνει και τις παραµέτρους των συναρτήσεων-µελών της κλάσης

31 Συναρτήσεις Inline Για συναρτήσεις που δεν είναι µέλη: Χρήση της λέξης-κλειδί inline στη δήλωση της συνάρτησης καθώς και στο heading της συνάρτησης Για τις συναρτήσεις-µέλη: Τοποθετούµε την υλοποίηση (κώδικα) για την συνάρτηση ΜΕΣΑ ΣΤΗ δήλωση της κλάσης γίνεται αυτόµατα inline Χρήση µόνο για σύντοµες συναρτήσεις Στην ουσία, η κλήση αντικαθίσταται από τον πλήρη κώδικα Απολοιφή του overhead Πιο αποδοτικό, αλλά µόνο όταν είναι σύντοµη!

32 Συναρτήσεις-µέλη Inline Ορισµοί συναρτήσεων-µελών Συνήθως ορίζονται χωριστά, σε διαφορετικό αρχείο Μπορούν να οριστούν ΜΕΣΑ στον ορισµό της κλάσης Κάνει τη συνάρτηση "in-line" Ξανά: χρήση µόνο για µικρές συναρτήσεις Πιο αποδοτικά Εάν είναι πολύ µεγάλη είναι λιγότερο αποδοτική!

33 Static Μέλη Static µεταβλητές-µέλη Όλα τα αντικείµενα της κλάσης µοιράζονται ένα αντίγραφο Όταν τροποποιείται η µεταβλητή αυτή από ένα αντικείµενο όλα τα αντικείµενα της κλάσης βλέπουν την αλλαγή Αρχικοποιούνται εκτός κλάσης Χρήσιµο για ιχνηλάτηση Πόσο συχνά καλείται µια συνάρτηση-µέλος Πόσα αντικείµενα της κλάσης υπάρχουν σε µια δεδοµένη στιγµή Τοποθετήστε τη λέξη-κλειδί static πριν τον τύπο δεδοµένων

34 Συναρτήσεις Static Οι συναρτήσεις-µέλη µπορεί και αυτές να είναι static Εάν δεν χρειάζεται προσπέλαση στα δεδοµένα του αντικειµένου Και πρέπει να είναι µέλος της κλάσης Την κάνουµε συνάρτηση static Μπορεί να κληθεί εκτός της κλάσης Από αντικείµενα που δεν ανήκουν στην κλάση: Π.χ., Server::getTurn(); Καθώς και από αντικείµενα της κλάσης Συνήθης µέθοδος: myobject.getturn(); Μπορούν να χρησιµοποιούν µόνο τα static δεδοµένα, και συναρτήσεις!

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

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

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

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

39 Η κλάση Vector της STL Εισαγωγή στην κλάση Vector Θυµηθείτε: οι πίνακες έχουν σταθερό µέγεθος Vectors: πίνακες που µικραίνουν και µεγαλώνουν κατά την εκτέλεση του προγράµµατος Προέρχονται από την Standard Template Library (STL)

40 Τα βασικά για την κλάση Vector Όµοια µε τους πίνακες: Έχει βασικό τύπο Αποθηκεύει συλλογή από τιµές του βασικού τύπου ηλώνεται διαφορετικά: Σύνταξη: vector<base_type> Προσδιορίζει µια template class Οποιοσδήποτε τύπος µπορεί να αποτελέσει το Base_Type Παράγει µια νέα κλάση για διανύσµατα αυτού του τύπου Παράδειγµα δήλωσης: vector<int> v;

41 Χρήση του Vector vector<int> v; v είναι ένα vector τύπου int Καλεί τον default constructor της κλάσης ηµιουργείται ένα κενό vector Υποστηρίζουν δεικτοδότηση για την προσπέλαση όπως και οι πίνακες Αλλά για την προσθήκη στοιχείων: Πρέπει να κληθεί η συνάρτηση-µέλος push_back Συνάρτηση-µέλος size() Επιστρέφει τον τρέχοντα αριθµό των στοιχείων του vector

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

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

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

45 Περίληψη (1/2) Constructors: αυτόµατη αρχικοποίηση των αντικειµένων Καλούνται όταν δηλώνονται τα αντικείµενα Ο Constructor έχει το ίδιο όνοµα µε την κλάση Ο Default constructor δεν έχει παραµέτρους Πάντα θα πρέπει να τον ορίζουµε Μεταβλητές-µέλη της class Μπορεί να είναι αντικείµενα άλλης κλάσης Απαιτούν τµήµα-αρχικοποίησης

46 Περίληψη (2/2) Constant call-by-reference παράµετροι Πιο αποδοτικά σε σχέση µε τις call-by-value Μπορούµε να κάνουµε inline πολύ µικρούς ορισµούς συναρτήσεων Βελτιώνουν την αποτελεσµατικότητα Static µεταβλητές-µέλη Κοινές για όλα τα αντικείµενα της κλάσης Κλάσεις Vector Όπως: πίνακες που µεγαλώνουν και µικραίνουν δυναµικά

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

48 Στόχοι εκµάθησης Βασικός µηχανισµός overloading τελεστών Μοναδιαίοι τελεστές Ως συναρτήσεις-µέλη Friends και αυτόµατη µετατροπή τύπων Συναρτήσεις friend, κλάσεις friend Constructors για αυτόµατη µετατροπή τύπων References και overloading << και >> Τελεστές: =, [], ++, --

49 Υπερφόρτωση Τελεστών (1/2) Τελεστές +, -, %, ==, etc. Είναι και αυτοί συναρτήσεις! Απλά καλούνται µε διαφορετική σύνταξη:x + 7 "+" είναι δυαδικός τελεστής µε x και 7 ως τελεστέους είτε το ως εξής: +(x, 7) "+" είναι το όνοµα της συνάρτησης x, 7 είναι τα ορίσµατα Η συνάρτηση "+" επιστρέφει το άθροισµα των ορισµάτων της

50 Υπερφόρτωση Τελεστών (2/2) Ενσωµατωµένοι τελεστές π.χ., +, -, =, %, ==, /, * Λειτουργούν ήδη στη C++ για built-in τύπους Στο συνήθη δυαδικό συµβολισµό Μπορούµε να τους υπερφορτώσουµε! Για να λειτουργούν µε τους δικούς µας τύπους! Για να προσθέσουµε "Chair types", ή "Money types" Όπως µας εξυπηρετεί Πάντοτε υπερφορτώνουµε για παρόµοιες λειτουργίες!

51 Τα βασικά της υπερφόρτωσης Υπερφόρτωση τελεστών ΠΟΛΥ όµοιο µε την υπερφόρτωση συναρτήσεων Ο τελεστής παίζει το όνοµα της συνάρτησης Παράδειγµα δήλωσης: const Money operator +(const Money& amount1, const Money& amount2); Υπερφορτώνει το + για τελεστέους τύπου Money Χρησιµοποιεί const παραµέτρους µε αναφορά για εποδοτικότητα Η επιστρεφόµενη τιµή είναι τύπου Money Επιτρέπει πρόσθεση αντικειµένων "Money"

52 Ορισµός + για Money

53 Υπερφόρτωση == Τελεστής ισότητας, == Επιτρέπει σύγκριση αντικειµένων τύπου Money ήλωση: bool operator ==(const Money& amount1, const Money& amount2); Επιστρέφει τύπο bool type για ισότητα true/false εν είναι συνάρτηση-µέλος (όπως δεν είναι και ο τελεστής + )

54 Ορισµός == για Money

Constructors που επιστρέφουν 55 αντικείµενα Ο Constructor είναι µια "void" συνάρτηση? Τον αντιµετωπίζουµε ως τέτοιο, αλλά δεν είναι Είναι µια ειδικού τύπου συνάρτηση Με ξεχωριστές ιδιότητες ΜΠΟΡΕΙ να επιστρέφει µια τιµή! Θυµηθείτε τη δήλωση return στην υπερφόρτωση του "+" για τύπους Money: return Money(finalDollars, finalcents); Επιστρέφει ένα στιγµιότυπο της κλάσης Money! Έτσι, ο constructor στην πραγµατικότητα επιστέφει ένα αντικείµενο! Αποκαλείται ανώνυµο αντικείµενο

56 Επιστροφή µιας const τιµής Θεωρήστε ξανά τον τελεστή "+": const Money operator +(const Money& amount1, const Money& amount2); Επιστρέφει ένα const αντικείµενο? Γιατί? είτε την επίπτωση του να επιστρέψουµε ένα non-const αντικείµενο για να το αντιληφθείτε

57 Επιστροφή µιας non-const τιµής Θεωρήστε no const στη δήλωση: Money operator +( const Money& amount1, const Money& amount2); Θεωρήστε την έκφραση που καλεί: m1 + m2 Όπου τα m1 και m2 είναι αντικείµενα τύπου Money Το αντικείµενο που επιστρέφεται είναι τύπου Money Μπορούµε να κάνουµε διάφορα πράγµατα µε τα αντικείµενα! Όπως για παράδειγµα, να καλέσουµε τις συναρτήσεις-µέλη τους

58 Τι µπορούµε να κάνουµε µε nonconst αντικείµενα Μπορούµε να καλέσουµε συναρτήσεις-µέλη: Να εκτελέσουµε τις συναρτήσεις-µέλη του αντικειµένου που επιστρέφεται από την πράξη m1+m2: (m1+m2).output(); //Νόµιµο εν υπάρχει πρόβληµα, τίποτε δεν αλλάζει (m1+m2).input(); //ΝΟΜΙΜΟ! ΠΡΟΒΛΗΜΑ! //Νόµιµο, αλλά ΤΡΟΠΟΠΟΙΕΙ κάτι! Επιτρέπει τροποποίηση ενός ανώνυµου αντικειµένου! εν µπρούµε να το επιτρέψουµε! Συνεπώς ορίσουµε το αντικείµενο επιστροφής να είναι const

59 Υπερφόρτωση µοναδιαίων τελεστών Η C++ έχει µοναδιαίους τελεστές: Ορίζονται ως να δέχονται έναν τελεστέο π.χ., - (άρνηση) x = -y; Άλλοι µοναδιαίοι τελεστές: ++, -- // Θέτει το x ίσο µε το αρνητικό του y Οι µοναδιαίοι τελεστές µπορούν επίσης να υπερφορτωθούν

60 Υπερφόρτωση του - για Money ήλωση υπερφόρτωσης του - Τοποθετείται εκτός δήλωση της κλάσης: const Money operator (const Money& amount); Σηµειώστε: δέχεται µόνο ένα όρισµα Ο τελεστής "-" υπερφορτώνεται δύο φορές! Για δυο τελεστέους/ορίσµατα (δυαδικός) Για έναν τελεστέο/όρισµα (µοναδιαίος) Πρέπει να υπάρχουν ορισµοί και για τις δυο περιπτώσεις

61 Overloaded "-" Definition Ορισµός υπερφόρτωσης "-": const Money operator (const Money& amount) { return Money(-amount.getDollars(), -amount.getcents()); } Εφαρµόζει τον µοναδιαίο τελεστή - σε built-in τύπους, για τους οποίους η πράξη είναι γνωστή Επιστρέφει ανώνυµο αντικείµενο

62 Χρήση υπερφορτωµένου "-" Θεωρήστε το: Money amount1(10), amount2(6), amount3; amount3 = amount1 amount2; Καλεί τον δυαδικό υπερφορτωµένο "-" amount3.output(); //Αποτέλεσµα $4.00 amount3 = -amount1; Καλεί τον µοναδιαίο υπερφορτωµένο "-" amount3.output() // Αποτέλεσµα -$10.00

Υπερφορτωµένοι τελεστές ως 63 συναρτήσεις-µέλη Στα προηγούµενα παραδείγµα: ανεξάρτητες συναρτήσεις Ορισµένες έξω από κλάσεις Μπορεί να γίνει υπερφόρτωση ως "member operator" Θεωρείται συνάρτηση-µέλος όπως και οι υπόλοιπες Όταν ο τελεστής είναι συνάρτηση-µέλος: Μόνο ΜΙΑ παράµετρος, όχι δυο! Το καλούν αντικείµενο λειτουργεί ως 1 st παράµετρος

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

65 Συναρτήσεις const Πότε να κάνουµε µια συνάρτηση const? Οι constant συναρτήσεις δεν επιτρέπεται να τροποποιούν τα δεδοµένα-µέλη της κλάσης Τα const objects µπορούν να καλούν ΜΟΝΟ constant συναρτήσεις-µέλη Το καλό στυλ απαιτεί: Κάθε συνάρτηση-µέλος που δεν πρόκειται να τροποποιήσει τα δεδοµένα θα πρέπει να δηλώνεται ως const Χρήση της λέξης-κλειδί const µετά τη δήλωση της συνάρτησης και στο heading της

Υπερφόρτωση Κλήσης Συνάρτησης () 66 Τελεστής κλήσης συνάρτησης, ( ) Πρέπει να υπερφορτωθεί ως συνάρτηση-µέλος Επιτρέπει τη χρήση των αντικειµένων όπως µια τυπική συνάρτηση Μπορεί να υπερφορτωθεί για όλους τους πιθανούς αριθµούς ορισµάτων Παράδειγµα: Aclass anobject; anobject(42); Εάν υπερφορτωθεί ο ( ) καλεί την υπερφορτωµένη έκδοση

67 Άλλες υπερφορτώσεις &&,, και τελεστής comma Οι προκαθορισµένες εκδόσεις τους δουλεύουν για bool τύπους Θυµηθείτε: χρησιµοποιούν την short-circuit εκτίµηση Όταν υπερφορτωθούν, δεν την χρησιµοποιούν πλέον Χρησιµοποιούν την πλήρη εκτίµηση Γενικώς, θα πρέπει να αποφεύγουµε την υπερφόρτωσή τους

68 Συναρτήσεις Friend (1/2) εν είναι συναρτήσεις-µέλη Θυµηθείτε: υπερφόρτωση τελεστών ως µη συναρτήσεις-µέλη Προσπελάζουν τα δεδοµένα διαµέσου συναρτήσεων accessor και mutator Πολύ αναποτελεσµατικό (κόστος στις κλήσεις) Οι Friends µπορούν να προσπελάσουν άµεσα τα ιδιωτικά δεδοµένα της κλάσης εν υπάρχει κόστος, είναι πιο αποτελεσµατικό Συνεπώς: το καλύτερο είναι να κάνουµε friends τις nonmember operator υπερφορτώσεις!

69 Συναρτήσεις Friend (1/2) Συναρτήσεις Friend µιας κλάσης εν είναι συνάρτηση-µέλος Έχει άµεση πρόσβαση στα ιδιωτικά δεδοµένα της κλάσης Όπως και οι συναρτήσεις-µέλη της κλάσης Χρήση της λέξης-κλειδί friend πριν από τη δήλωση της συνάρτησης Καθορίζεται ΜΕΣΑ στον ορισµό της κλάσης εν είναι όµως συναρτήσεις-µέλη της κλάσης!

70 Χρήση συναρτήσεων Friend Υπερφόρτωση τελεστών Είναι η πιο κοινή χρήση των friends Βελτιώνει την αποδοτικότητα Αποφεύγει την ανάγκη κλήσης συναρτήσεων- µελών accessor/mutator Friend µπορεί να είναι οποιαδήποτε συνάρτηση

71 Αναγκαιότητα συναρτήσεων Friend Οι Friend είναι καθαρές? To πνεύµα του OOP επιβάλλει όλοι οι τελεστές και οι συναρτήσεις να είναι µέλη της κλάσης Πιστεύεται ότι οι friends παραβιάζουν τις βασικές αρχές του OOP Έχουν πλεονεκτήµατα? Για τους τελεστές: πάρα πολλά! Επιτρέπουν αυτόµατα µετατροπή τύπων Υποστηρίζουν την ενθυλάκωση: οι friends είναι µέσα σε κάποιον ορισµό κλάσης Βελτιώνουν την απόδοση

72 Κλάσεις Friend Ολόκληρες κλάσεις µπορεί να είναι friends Όοµοια µε τις συναρτήσεις που είναι friend σε µια κλάση Παράδειγµα: class F is friend of class C Όλες οι συναρτήσεις-µέλη της κλάσης F είναι friends της κλάσης C H friend-ship δεν αίρεται Σύνταξη: friend class F; Μπαίνει µέσα στον ορισµό της κλάσης, η οποία δίνει την εξουσιοδότηση στην F

73 Αναφορές (References) Αναφορά (Reference) ορίζεται ως: Όνοµα µιας θέσης αποθήκευσης Παρόµοια µε το δείκτη Παράδειγµα µιας stand alone reference: int robert; int& bob = robert; bob είναι αναφορά στη θέσης αποθήκευσης του robert Οι αλλαγές στο bob θα επηρρεάσουν το robert

74 Χρήση Αναφορών Είναι σχετικά επικίνδυνες Χρήσιµες σε µερικές περιπτώσεις: Call-by-reference Συχνά χρησιµοποιείται για την υλοποίηση του µηχανισµού αυτού Επιστρέφοντας µια αναφορά Επιτρέπει υλοποιήσεις υπερφόρτωσης τελεστών να γραφούν πιο φυσικά Σκεφτείτε το ως επιστροφή ενός "alias" σε µια µεταβλητή

75 Επιστροφή Αναφορών Σύνταξη: double& samplefunction(double& variable); double& and double are different Πρέπει να ταιριάζουν στη δήλωση και στο heading της συνάρτησης Το επιστρεφόµενο item πρέπει να έχει µια αναφορά Όπως µια µεταβλητή αυτού του τύπου εν µπορεί να είναι εκφράσεις όπως: "x+5" εν υπάρχει µέρος στη µνήµη στο οποίο να αναφερθεί

76 Παράδειγµα επιστροφής αναφοράς Παράδειγµα ορισµού συνάρτησης: double& samplefunction(double& variable) { return variable; } Απλό παράδειγµα επίδειξης των εννοιών Κύρια χρήση: Σε µερικούς υπερφορτωµένους τελεστές

77 Υπερφόρτωση των >> και << Επιτρέπει είσοδο και έξοδο των αντικειµένων που φτιάχνουµε Παρόµοια µε την υπερφόρτωση των άλλων τελεστών Βελτιώνει την αναγνωσιµότητα των προγραµµάτων Επιτρέπει: cout << myobject; cin >> myobject; Αντί για την ανάγκη να γράφουµε: myobject.output();

78 Υπερφόρτωση << Τελεστής << Χρησιµοποιείται µε cout Είναι δυαδικός τελεστής Παράδειγµα: cout << "Hello"; Ο τελεστής είναι ο << Ο 1 ος τελεστέος είναι το προκαθορισµένο αντικείµενο cout Από τη βιβλιοθήκη iostream Ο 2 ος τελεστέος είναι το αλφαριθµητικό "Hello"

79 Υπερφόρτωση << Τελεστέοι του << Το αντικείµενο cout, της κλασης ostream Η δική µας κλάση Θυµηθείτε την κλάση Money Χρησιµοποιούσε τη συνάρτηση-µέλος output() Θα ήταν προτιµότερο να χρησιµοποιούσαµε τον τελεστή <<: Money amount(100); cout << "I have " << amount << endl; αντί για το: cout << "I have "; amount.output();

80 Τιµή επιστροφής υπερφορτωµένου >> Money amount(100); cout << amount; Ο τελεστής << πρέπει να επιστρέφει κάποια τιµή Για να επιτρέψουµε διαδοχικά ορίσµατα: cout << "I have " << amount; (cout << "I have ") << amount; Τα παραπάνω είναι ισοδύναµα Τι επιστρέφει? cout object! Επιστρέφει αντικείµενο κλάσης του πρώτου ορίσµατος,ostream

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

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

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

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

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

86 Τελεστής ανάθεσης, = Θα πρέπει να υπερφορτωθεί ως member operator Υπερφορτώνεται αυτόµατα Εξ ορισµού τελεστής ανάθεσης: Αντιγραφή µελος-προς-µέλος Μεταβλητές-µέλη ενός αντικειµένου στις αντίστοιχες µεταβλητές-µέλη του άλλου αντικειµένου Η εξ ορισµού συµπεριφορά είναι OK για απλές κλάσεις Αλλά για δείκτες πρέπει να γράψουµε τον δικό µας τελεστή ανάθεσης!

87 Increment και Decrement Κάθε τελεστής έχει δυο εκδόσεις Προθεµατικός τελεστής: ++x; Μεταθεµατικός τελεστής: x++; Πρέπει να γίνει η διάκριση στην υπερφόρτωση Τυπικά υπερφορτώνεται η προθεµατική έκδοση Προσθέτουµε 2 ο παράµετρο τύπου int Μεταθεµατική Απλά ένα σύµβολο για τον compiler!

88 Υπερφόρτωση τελεστή πίνακα, [ ] Μπορούµε να υπερφορτώσουµε τον [ ] Για να χρησιµοποιείται για αντικείµενα των κλάσεων που ορίζουµε Ο τελεστής πρέπει να επιστρέφει µια αναφορά! Ο τελεστής [ ] πρέπει να είναι συνάρτηση- µέλος!

89 Περίληψη (1/2) Οι built-in τελεστές της C++ µπορούν να υπερφορτωθούν για να λειτουργήσουν για τις δικές µας κλάσεις Οι τελεστές είναι απλά συναρτήσεις Οι συναρτήσεις friend έχουν άµεση πρόσβαση στα ιδιωτικά δεδοµένα των κλάσεων Οι τελεστές µπορούν να υπερφορτωθούν ως συναρτήσεις µέλη Ο 1 ος τελεστέος είναι το καλούν αντικείµενο

90 Περίληψη (2/2) Οι συναρτήσεις friend απλά προσθέτουν αποδοτικότητα εν χρειάζονται, εάν υπάρχουν αρκετές συναρτήσεις accessors/mutators Οι αναφορές ονοµατίζουν µια µεταβητή µε ένα alias Μπορούµε να υπερφορτώσουµε τους << και >> Ο τύπος επιστροφής είναι µια αναφορά σε τύπο stream

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

92 Πίσω στις κλάσεις Ο τελεστής -> Σύντοµος συµβολισµός Συνδυάζει τους τελεστές: dereference (*) και dot (.) Καθορίζει το µέλος της κλάσης που δείχνεται από τον συγκεκριµένο δείκτη Παράδειγµα: MyClass *p; p = new MyClass; p->grade = "A"; //Equivalent to: (*p).grade = "A";

93 Ο δείκτης this Οι ορισµοί των συναρτήσεων-µελών πολλές φορές χρειάζεται να αναφέρονται στο καλούν αντικείµενο Χρήση του προκαθορισµένου δείκτη this Αυτόµατα δείχνει στο καλούν αντικείµενο: Class Simple { public: void showstuff() const; private: int stuff; }; Οι συναρτήσεις-µέλη µπορούν να χρησιµοποιούν οποιονδήποτε από τα παρακάτω για προσπέλαση: cout << stuff; cout << this->stuff;

94 Υπερφόρτωση τελεστή ανάθεσης (1/2) Ο τελεστής ανάθεσης επιστρέφει αναφορά Έτσι ώστε αλυσίδες αναθέσεων να είναι πιθανές π.χ., a = b = c; Θέτει τα a και b ίσα µε το c Ο τελεστής πρέπει να επιστρέφει ίδιο τύπο µε αυτόν αριστερά του Για να επιτρέψει τις αλυσίδες Ο δείκτης this βοηθάει σ αυτό!

95 Υπερφόρτωση τελεστή ανάθεσης (2/2) Θυµηθείτε: Ο τελεστής ανάθεσης πρέπει να είναι µέλος της κλάσης Έχει µόνο µια παράµετρο Ο αριστερός τελεστέος είναι το καλούν αντικείµενο s1 = s2; Σκεφτείται το ως εξής: s1.=(s2); s1 = s2 = s3; Απαιτεί (s1 = s2) = s3; Έτσι το (s1 = s2) πρέπει να επιστρέφει αντικείµενο του ίδιου τύπου µε τον τύπο του s1 Και να το περάσει στο = s3 ;

96 Ορισµός υπερφορτωµένου τελεστή = Παράδειγµα µε χρήση της κλάσης string: StringClass& StringClass::operator=(const StringClass& rtside) { } if (this == &rtside) // if right side same as left side return *this; else { capacity = rtside.length; length length = rtside.length; delete [] a; a = new char[capacity]; for (int I = 0; I < length; I++) a[i] = rtside.a[i]; return *this; }

97 Ρηχά και βαθιά αντίγραφα Ρηχό αντίγραφο Η ανάθεση αντιγράφει µόνο τα περιεχόµενα των µεταβλητών-µελών Η εξ ορισµού ανάθεση και ο copy constructor Βαθύ αντίγραφο είκτες, εµπλέκεται δυναµική µνήµη Πρέπει να βρούµε πού δείχνει ο δείκτης για να πάρουµε τα δεδοµένα του για αντιγραφή Γράψτε το δικό σας τελεστή ανάθεσης και copy constructor για τις περιπτώσεις αυτές!

98 Η ανάγκη για destructor υναµικά δεσµευµένες µεταβλητές εν εξαλείφονται µέχρι να διαγραφούν Εάν οι δείκτες είναι δηµόσια δεδοµένα της κλάσης Την αποδέσµευση µπορεί να την κάνουν άλλες εξωτερικές της κλάσης συναρτήσεις Εάν οι δείκτες είναι ιδιωτικά µόνο δεδοµένα της κλάσης υναµικά δεσµεύουν πραγµατικά δεδοµένα Στον constructor Πρέπει να υπάρχει τρόπος για να τα αποδεσµεύσουµε όταν καταστραφεί το αντικείµενο Απάντηση: ο destructor!

99 Destructor Η αντίθετη έννοια του constructor Καλείται αυτόµατα όταν το αντικείµενο βρεθεί out-ofscope Η εξ ορισµού έκδοση καταστρέφει µόνο τις συνήθεις µεταβλητές και όχι τις δυναµικές Ορίζεται όπως ο constructor, αλλά προσθέτουµε το tilde ~ MyClass::~MyClass() { //Perform delete clean-up duties }

100 Copy Constructors Καλούνται αυτόµατα όταν: 1. ηλώνεται ένα αντικείµενο κλάσης και αρχικοποιείται σε κάποιο άλλο αντικείµενο 2. Όταν µια συνάρτηση επιστρέφει αντικείµενο 3. Όταν όρισµα τύπου κλάσης περνάει ως πραγµατικό όρισµα σε µια κλήση-µε-τιµή Απαιτεί προσωρινό αντίγραφο του αντικειµένου Ο copy constructor το δηµιουργεί Εξ ορισµού copy constructor Όπως και ο εξ ορισµού τελεστής ανάθεσης "=", εκτελεί αντιγραφή µέλος-προς-µέλος είκτες γράψτε το δικό του copy constructor!