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

Σχετικά έγγραφα
Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

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

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

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

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

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

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

Προγραµµατιστικές τεχνικές

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

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

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

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

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

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

υναµικές οµές εδοµένων

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

ΗΥ-150. Πίνακες (Arrays)

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

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

Ανάπτυξη και Σχεδίαση Λογισμικού

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

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

Δομές Δεδομένων και Αλγόριθμοι

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

Εισαγωγή στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

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

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

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

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

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

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ Εντολές επανάληψης Εντολές επανάληψης while for do-while ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ Παράδειγμα #1 Εντολή while

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Δομές Δεδομένων & Αλγόριθμοι

Προγραμματισμό για ΗΜΥ

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

Προγραμματιστικές τεχνικές

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

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

οµές (structures) και Eνώσεις (unions)

Εισαγωγή στη γλώσσα προγραμματισμού C++

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

Διδάσκων: Παναγιώτης Ανδρέου

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

Δυναμική μνήμη με πίνακες και λίστες

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Transcript:

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: είκτες στη C++ Οι τελεστές new και delete Destructors Ορισµός τελεστών κλάσεων Ο δείκτης this ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1 είκτες Η έννοια του δείκτη εφαρµόζεται στην C++ όπως και στη C προσφέροντας µηχανισµό µέσω του οποίου µπορούµε να προσπελάσουµε αντικείµενa µέσω της διεύθυνσή τους, για πέρασµα παραµέτρων από την γραµµή εντολής προς ένα πρόγραµµα, για την δυναµική δηµιουργία αντικειµένων. Η χρήση τους για τους δύο πρώτους στόχους γίνεται όπως και στη C. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 1

είκτες ηλώσεις δεικτών: int *iptr; char *s; Time *tptr; // o iptr είναι δείκτης σε int // ο s είναι δείκτης σε char // ο tptr είναι δείκτης σε // αντικείµενο τύπου class Time. ηλώσεις δεικτών µε αρχικοποίηση: int i = 1; char c = 'y'; int *ptr = &i; char *t = &c; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 3 int i = 1; char c = 'y'; int *ptr = &i; char *t = &c Παράσταση στη µνήµη t points to address of a character i 1 c 'y' t ptr Ποιο θα ήταν το αποτέλεσµα των πιο κάτω εντολών; cout << *ptr << endl; cin >> *t; ptr points to the address of an integer ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 4 2

Σταθερές και δείκτες Ένας σταθερός δείκτης είναι ένας δείκτης του οποίου η τιµή δεν µπορεί να αλλαχθεί (δηλαδή δεν µπορούµε να αλλάξουµε τη διεύθυνση στην οποία δείχνει ο δείκτης). char c = 'c'; const char d = 'd'; char * const ptr1 = &c; ptr1 = &d; // illegal Ένας δείκτης σε µια σταθερά τιµή είναι δείκτης που δείχνει σε ένα αντικείµενο του οποίου η τιµή δεν µπορεί να αλλάξει. const char *ptr2 = &d; *ptr2 = 'e'; // illegal ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 5 υναµικά αντικείµενα Κατά τη δυναµική διαχείριση µνήµης µπορούµε να δηµιουργούµε αντικείµενα δυναµικά, µέσω αιτήσεων για παροχή µνήµης. αυτό γίνεται µέ τον τελεστή new. υναµικά αντικείµενα έχουν εµβέλεια εκτός από την συνάρτηση στην οποία ορίζονται. Mνήµη που χρησιµοποιείται από δυναµικά αντικείµενα µπορεί να επιστραφεί µέσω του τελεστή delete. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 6 3

O τελεστής new Εφαρµογή του τελεστή ζητά ελεύθερη µνήµη από το σύστηµα, προσδιορίζονται τον τύπο και το πλήθος των αντικειµένων που θα δηµιουργηθούν. Αν υπάρχει διαθέσιµη µνήµη, η πράξη αυτή θα έχει ως αποτέλεσµα την επιστροφή δείκτη προς το κοµµάτι µνήµης που έχει παραχωρηθεί. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 7 Χρήση new (1) Σύνταξη Ptr = new SomeType ; όπου ο Ptr έχει ορισθεί ως δείκτης τύπου SomeType Η νεοδηµιουργηθείσα µνήµη δεν αρχικοποιείται, εκτός αν υπάρχει default constructor του τύπου SomeType. Παράδειγµα: int *iptr = new int; Time *tptr = new Time; iptr Uninitialized int object trptr 0,0,0 0/1 Rational Αντικείµενο object Time with default µε την default initialization αρχικοποίηση ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 8 4

Χρήση του new (2) Σύνταξη SomeType *Ptr = new SomeType(ParameterList); Αρχικοποίηση Η µνήµη που επιστρέφεται από την πράξη αυτή αρχικοποιείται δίνοντας τιµές στον κατασκευαστή της κλάσης SomeType Παράδειγµα: int *iptr = new int(10); Time *tptr = new Time(16,15,0); iptr Αντικείµενο int µε ρητή Uninitialized αρχικοποίηση int object 10 trptr 16,15,0 0/1 Αντικείµενο Rational object Time with µεdefault ρητή αρχικοποίηση initialization ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 9 Xρήση new (3) Σύνταξη P = new SomeType [Expression] ; όπου ο P είναι δείκτης του τύπου SomeType Expression είναι ο αριθµός των συνεχόµενων αντικειµένων τύπου SomeType που θέλουµε να δηµιουργηθούν φτιάχνουµε λίστα Λόγω της σύνταξης που µας παρέχουν οι δείκτες ο P µπορεί να θεωρηθεί και να χρησιµοποιηθεί ως πίνακας. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 10 5

int *A = new int [3]; Time *T = new Time[2]; A[1] = 5; Time r(1, 1, 1); T[0] = r; Παράδειγµα ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 11 ηµιουργία πινάκων Έστω διαδικασίες Getlist, SortList, και DisplayList, που επεξεργάζονται πίνακες, το ποιο κάτω πρόγραµµα, δηµιουργεί ένα πίνακα µεγέθους που προσδιορίζεται από το χρήστη, λαµβάνει τα στοιχεία του, τα ταξινοµεί και τον εµφανίζει στην οθόνη. cout << "Enter list size: "; int n; cin >> n; int *A = new int[n]; GetList(A, n); SelectionSort(A, n); DisplayList(A, n); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 12 6

Ο τελεστής delete Σύνταξη delete P; // used if storage came from new delete [] P; // used if storage came from new[] Η µνήµη που δείχνεται από τον P επιστρέφεται. int n; cout << "Enter list size: "; cin >> n; int *A = new int[n]; GetList(A, n); SelectionSort(A, n); DisplayList(A, n); delete [] A; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 13 Αντιγραφή πινάκων int *A = new int[5]; for (int i = 0; i < 5; ++i) A[i] = i; int *B = A; A B 0 1 2 3 4 delete [] A; A B Locations do not belong to program? ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 14 7

ιαρροή Μνήµης int *A = new int [5]; for (int i = 0; i < 5; ++i) A[i] = i; A 0 1 2 3 4 A = new int [5]; These locations cannot be accessed by program A 0 1 2 3 4 ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 15 Παράδειγµα: υναµική λίστα Θα δηµιουργήσουµε κλάση IntList που υλοποιεί δυναµικές λίστες. Η διασύνδεση της κλάσης αυτής θέλουµε να µοιάζει µε αυτή ενός πίνακα, π.χ. να αναφερόµαστε στο i-οστό αντικείµενο ενός αντικειµένου Α της κλάσης αυτής ως Α[i]. Εποµένως θα πρέπει η κλάση να κάνει overload τον τελεστή []. Από την άλλη, αντικείµενα της κλάσης µας δεν θα έχουν τους γνωστούς περιορισµούς πινάκων: η κλάση µας θα επιτρέπει ανάθεση αντικειµένων της κλάσης (=> θα κάνουµε overload τον τελεστή =,) αντικείµενα της κλάσης µπορούν να είναι το αποτέλεσµα επιστροφής διαδικασιών,... Επίσης η κλάσης µας θα προσφέρει τις πιο κάτω συµπεριφορές: δηµιουργία νέων λίστών µε default τιµές (constructors) δυνατότητες εισαγωγής και εξαγωγής στοιχείων επιστροφή του µεγέθους της λίστας και αλλαγή του µεγέθους της λίστας. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 16 8

Παραδείγµατα χρήσης της IntList IntList A(5, 1); IntList B(10, 2); IntList C(5, 4); for (int i = 0, i < A.size(); ++i) { A[i] = C[i]; cout << A << endl; // [ 4 4 4 4 4 ] A = B; A[1] = 5; cout << A << endl; // [ 2 5 2 2 2 2 2 2 2 2 ] ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 17 Η κλάση IntList class IntList { public: // κατασκευαστές IntList(int n = 10, int val = 0); IntList(IntList &A); // destructor ~IntList(); // συνάρτηση που επιστρέφει το µήκος λίστας int size(); // τελεστής ανάθεσης = IntList & operator=(intlist &A); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 18 9

Η κλάση IntList (συν.) // τελεστής [] int& operator[](int i); // συνάρτηση αλλαγής µεγέθους λίστας void resize(int n = 0, int val = 0); // συνάρτηση εισαγωγής στοιχείου στο τέλος void push_back(int val); private: // δεδοµένα κλάσης int *Values; // δείκτης προς στοιχεία int NumberValues; // µήκος λίστας ; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 19 Η κλάση IntList (συν.) // Βοηθητικές συναρτήσεις ostream& operator<<(ostream &sout, IntList &A); istream& operator>>(istream &sin, IntList &A); ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 20 10

Κατασκευαστής 1 IntList::IntList(int n, int val) { assert(n > 0); NumberValues = n; Values = new int [n]; assert(values); for (int i = 0; i < n; ++i) { Values[i] = val; συνάρτηση από τη βιβλιοθήκη assert.h. Αν η παράµετρος της πάρει την τιµή false η εκτέλεση του προγράµµατος τερµατίζεται δίνοντας κατάλληλο µήνυµα προς τον χρήση ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 21 Κατασκευαστής 2 Θέλουµε να φτιάξουµε κατασκευαστή ο οποίος παίρνει ως παράµετρο αντικείµενο και δηµιουργεί καινούριο αντικείµενο, αντίγραφο του παλιού. Αυτή η δυνατότητα παρέχεται για κάθε κλάση στη C++. ηλαδή, για κάθε κλάση Class SomeClass o πιο κάτω κώδικας SomeClass t;... SomeClass r(t); έχει ως αποτέλεσµα να δηµιουργήσει δύο αντικείµενα της κλάσης SomeClass όπου το δεύτερο (r) είναι αντίγραφο του πρώτου (t). ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 22 11

Κατασκευαστής 2 Έστω ότι θέλουµε να φτιάξουµε αντίγραφο κάποιου αντικειµένου της κλάσης IntList. Μπορεί αυτό να επιτευχθεί µέσω του default κατασκευαστή αντιγραφής; Εκτελώντας IntList A(3, 1); 3 A IntList B(A); 1 2 1 και στη συνέχεια A[2] = 2; Τότε B 3 το B[2] έχει αλλάξει! ενώ εµείς θα αναµέναµε ότι το B είναι ένα ανεξάρτητο αντίγραφο του Α. Εποµένως... ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 23 Τελεστές και δυναµικά αντικείµενα Οταν µια κλάση περιέχει πεδίο το οποίο δείχνει προς δυναµικά δεσµευµένη µνήµη τότε για αυτή την κλάση τυπικά θα πρέπει να ορίσουµε ξανά τη διαδικασία... Κατασκευαστής αντιγραφής Κατασκευαστής ο οποίος κτίζει ένα αντικείµενο ως αντίγραφο αντικειµένου του ίδιου τύπου. όπως και τις διαδικασίες... Destructor Ένας αντί-κατασκευαστής ο οποίος αποδεσµεύει τη δυναµικά δεσµευµένη µνήµη που περιέχεται µέσα σε αντικείµενα της κλάσης (όταν αυτά δεν είναι πια χρησιµοποιήσιµα). Τελεστής ανάθεσης Αλλάζει την τιµή ενός αντικειµένου µε βάση ένα άλλο αντικείµενο του ίδιου τύπου. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 24 12

Κατασκευαστής αντιγραφής IntList::IntList(IntList &A) { NumberValues = A.size(); Values = new int [NumberValues]; assert(values); for (int i = 0; i < NumberValues; ++i) Values[i] = A[i]; Τι είδους subscripting εκτελείται εδώ; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 25 Destructor Τι συµβαίνει όταν ένα αντικείµενο τύπου IntList βγεί εκτός της εµβέλειας ενός προγράµµατος; Aν δεν έχει προγραµµατιστεί τίποτα τότε θα έχουµε διαρροή µνήµης. Εναλλακτικά µπορούµε να ορίσουµε ένα destructor για την κλάση. Ο destructor καλείται αυτόµατα όταν το αντικείµενο πάψει να υπάρχει για το πρόγραµµα. Ο destructor της κλάσης ClassName πρέπει να οριστεί µε το όνοµα ~ClassName. Ένας destructor δεν µπορεί να πάρει καµιά παράµετρο και δεν επιστρέφει κανένα αποτέλεσµα. IntList::~IntList() { delete [] Values; Προσοχή στο ~ ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 26 13

Ο Τελεστής [] και ο Τελεστής Ανάθεσης Ο τελεστής []: int& IntList::operator[](int i) { assert((i >= 0) && (i < size())); return Values[i]; Ο τελεστής ανάθεσης: Θέλουµε να κάνουµε overload τον τελεστή = έτσι ώστε η ανάθεση A=B να έχει ως αποτέλεσµα την αντιγραφή της λίστας Β στη λίστα Α. Αλγόριθµος 1: Επέστρεψε την υπάρχουσα δυναµικά δεσµευµένη µνήµη. έσµευσε κατάλληλη ποσότητα µνήµης. Αντίγραψε τα περιεχόµενα του ενός αντικειµένου στο άλλο. ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 27 Προσπάθεια 1 IntList& ΙntList::operator=(IntList &A) { NumberValues = A.size(); delete [] Values; Values = new int [NumberValues ]; assert(values); for (int i = 0; i < A.size(); ++i) Values[i] = A[i]; return A; Ποιο είναι το αποτέλεσµα του πιο κάτω προγράµµατος; C(5,1); C = C; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 28 14

Ο δείκτης this Σε οποιαδήποτε µέθοδο ή τελεστή ενός αντικειµένου ο δείκτης this δείχνει προς το αντικείµενο που την περιέχει. Έτσι για παράδειγµα, αντί του int IntList::size() { return NumberValues; ισοδύναµα µπορούµε να γράψουµε int IntList::size() { return this->numbervalues; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 29 Τελεστής ανάθεσης Προσπάθεια 2 IntList& IntList::operator=(IntList &A) { if (this!= &A) { delete [] Values; NumberValues = A.size(); Values = new int [A.size()]; assert(values); for (int i = 0; i < A.size(); ++i) { Values[i] = A[i]; return *this; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 30 15

Τελεστές για Ι/O Μήπως θα έπρεπε οι τελεστές << και >> να οριστούν ως µέλη της συνάρτησης Intlist; class IntList { //... ostream& operator<<(ostream &sout); //... ; H απάντηση εξαρτάται από το πως θέλουµε να καλούµε τους τελεστές αυτούς: Έστω IntList A(5,1); Επιλογή 1: Ορισµός << ως µέλους συνάρτησης: A << cout; //(λιγότερο φυσικό) Επιλογή 2: Ορισµός << ως βοηθητικής συνάρτησης: cout << A; // (πιο φυσικό) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 31 Ο τελεστής << ostream& operator<<ostream &sout, IntList &A){ sout << "[ "; for (int i = 0; i < A.size(); ++i) { sout << A[i] << " "; sout << "]"; return sout; ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 32 16