Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Ενότητα 6: Κατανομή και Δυναμική Διαχείριση Μνήμης, τελεστές new και delete, υπερφόρτωση μονομελών τελεστών Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Αντικειμενοστραφής Προγραμματισμός Διάλεξη 6
Περιεχόμενα Δυναμική Διαχείριση μνήμης Τελεστές new και delete Υπερφόρτωση Τελεστών Υπερφόρτωση Μονομελών Τελεστών Προσωρινά Αντικείμενα και Επιθεματική Σημειογραφία μονομελών τελεστών
Δυναμική Διαχείριση Μνήμης Η εντολή int Α[100]; Δεσμεύει μνήμη για 100 ακέραιους. Οι πίνακες είναι μια χρήσιμη λύση στο θέμα της αποθήκευσης δεδομενων αλλά έχουν ένα σοβαρό μειονέκτημα: την ώρα που γράφουμε το πρόγραμμα, πρέπει να γνωρίζουμε πόσο μεγάλος είναι ο πίνακας. Σε πολλές περιπτώσεις όμως, μέχρι να εκτελεστεί το πρόγραμμα δε γνωρίζουμε πόση μνήμη θα χρειαστούμε
Τελεστές new και delete H C++ μας παρέχει ένα τελεστή για να δεσμεύουμε μνήμη: τον τελεστή new. Για την αποδέσμευση της μνήμης χρησιμοποιούμε τον τελεστή delete.
Παράδειγμα class mstring{ public: mstring(char *s); ~mstring(); void print(); private: char *str; };
Παράδειγμα mstring::mstring(char *s) { int len = strlen(s); str = new char[len+1]; strcpy(str,s); } mstring::~mstring() { cout<< Free memory <<endl; delete [] str; }
Υπερφόρτωση Τελεστών Η C++ μας δίνει τη δυνατότητα να χρησιμοποιήσουμε τους συνήθεις τελεστές (πχ. +,-) για να εκτελέσουμε λειτουργίες πάνω σε κλάσεις, εκτός από τους συνήθεις τύπους δεδομένων (πχ. int). Παράδειγμα: Μέχρι τώρα ξέρουμε ότι μπορούμε να χρησιμοποιήσουμε τον τελεστή + για την πρόσθεση 2 ακεραίων, αλλά δε μπορούμε να τον χρησιμοποιήσουμε για την πρόσθεση 2 αντικείμενων της κλάσης Counter που ορίσαμε στο προηγούμενο μάθημα
Υπερφόρτωση Τελεστών Η υπερφόρτωση τελεστών μας δίνει τη δυνατότητα να προσθέτουμε επιπλέον δυνατότητες στους ήδη υπάρχοντες τελεστές. Μια εντολή όπως η d3 = d3.addobjects(d1,d2); Μπορεί να μετατραπεί στην πιο ευανάγνωστη d3 = d1 + d2
Υπερφόρτωση μονομελών τελεστών Οι μονομελείς τελεστές επενεργούν σε έναν μόνο τελεστέο Παραδείγματα μονομελών τελεστών είναι οι τελεστές αύξησης και μείωσης, ++ και --. Στο παράδειγμα με τη κλάση Counter δημιουργήσαμε μια κλάση για να παρακολοθούμε μια μέτρηση. Τα αντικείμενα αυτής της κλάσης αυξανονταν με την κλήση της μεθόδου count1. c1.count1(); Ωστόσο, το πρόγραμμα μας θα ήταν πιο ευανάγνωστο αν γράφαμε: ++c1; Προσοχή: ο τελεστής ++ ενεργεί πάνω σε ένα αντικείμενο της Counter. Η C++ δεν ξέρει πως να το κάνει αυτό. Για να το μάθει πρέπει να υπερφόρτωσουμε τον τελεστή
Υπερφόρτωση μονομελών τελεστών Πώς μαθαίνουμε σε ένα κανονικό τελεστή της C++ να ενεργεί σε έναν τελεστέο που ορίζεται από τον χρήστη; Χρησιμοποιούμε την δεσμευμένη λέξη operator στη δήλωση της μεθόδου Παράδειγμα: void operator++(); Αυτή η σύνταξη λέει στον μεταγλωτιστή να καλέσει τη συνάρτηση μέλος όταν συνατήσει τον τελεστή ++ εφόσον ο τελεστέος είναι αντικέιμενο τύπου Counter
Υπερφόρτωση μονομελών τελεστών class Counter{ public: int get_count(); void set_count(int a); void operator++(); private: int count; };
Υπερφόρτωση μονομελών τελεστών int Counter::get_count() { return count; } void Counter::set_count(int a) { count = a; } void Counter::operator++() { ++count; }
Υπερφόρτωση μονομελών τελεστών int main() { Counter c1; } c1.set_count(0); cout<<"counter Value:"<<c1.get_count()<<endl; ++c1; cout<<"counter Value:"<<c1.get_count()<<endl; return 0;
Υπερφόρτωση μονομελών τελεστών Η συνάρτηση operator++ έχει ένα μικρό ελάττωμα. Θα το ανακαλύψετε αν χρησιμοποιήσετε μια εντολή όπως η c1=++c2; Όπως ορίσαμε τον τελεστή ++ δέν έχει επιστρεφόμενο τύπο. Συνεπώς, δε μπορούμε να χρησιμοποιήσουμε τον τελεστή σε εντολές απόδοσης τιμής. Φυσικά, ο κανονικός τελεστής ++ δεν έχει αυτό το πρόβλημα.
Υπερφόρτωση μονομελών τελεστών Counter Counter::operator++() { ++count; Counter temp; temp.count = count; return temp; }
Προσωρινά Αντικείμενα Στο προηγούμενο παράδειγμα χρησιμοποιήσαμε ένα προσωρινό αντικέιμενο τύπου Counter, το temp, που είχε ως σκοπό να παρέχει μια επιστρεφόμενη τιμή στη μέθοδο. Υπάρχουν ευκολότεροι τρόποι να επιστρέφουμε προσωρινά αντικείμενα από μεθόδους και υπερφορτωμένους τελεστές κάνοντας χρήση των συναρτήσεων δημιουργίας.
Προσωρινά Αντικείμενα class Counter{ public: Counter(); Counter(int a); ~Counter(); int get_count(); void set_count(int a); Counter operator++(); private: int count; };
Προσωρινά Αντικείμενα Counter Counter::operator++() { ++count; return Counter(count); }
Επιθεματική Σημειογραφία Μέχρι τώρα είδαμε τη χρήση του τελεστή αύξησης με τη μορφή προθέματος ++c1 Τι γίνεται με τη μορφή επιθέματος; c1++; Για να μπορέσουν να δουλέψουν και οι δύο εκδοχές του τελεστή αύξησης, ορίζουμε δύο υπερφορτμένους τελεστές ++
Επιθεματική Σημειογραφία class Counter{ public: Counter(); Counter(int a); ~Counter(); int get_count(); void set_count(int a); Counter operator++(); Counter operator++(int); private: int count; };
Επιθεματική Σημειογραφία Counter Counter::operator++() { return Counter(++count); } Counter Counter::operator++(int) { return Counter(count++); }
Επιθεματική Σημειογραφία Υπάρχουν δύο διαφορετικές μέθοδοι για την επιφόρτωση του τελεστή ++. Counter operator++(); Counter operator++(int); Η μόνη διαφορά είναι το int στις παρενθέσεις. Αυτό το int δεν είναι στην πραγματικότητα όρισμα και δεν σημαίνει ακέραιο αριθμό. Είναι απλώς ένα σήμα προς τον μεταγλωττιστή να δημιουργήσει μια επιθεματική εκδοχή του τελεστή.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό. Οι όροι χρήσης των έργων τρίτων επεξηγούνται στη διαφάνεια «Επεξήγηση όρων χρήσης έργων τρίτων». Τα έργα για τα οποία έχει ζητηθεί άδεια αναφέρονται στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/από-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί.
Επεξήγηση όρων χρήσης έργων τρίτων διαθέσιμο με άδεια CC-BY διαθέσιμο με άδεια CC-BY-SA διαθέσιμο με άδεια CC-BY-ND διαθέσιμο με άδεια CC-BY-NC διαθέσιμο με άδεια CC-BY-NC-SA διαθέσιμο με άδεια CC-BY-NC-ND διαθέσιμο με άδεια CC0 Public Domain διαθέσιμο ως κοινό κτήμα χωρίς σήμανση Δεν επιτρέπεται η επαναχρησιμοποίηση του έργου, παρά μόνο εάν ζητηθεί εκ νέου άδεια από το δημιουργό. Επιτρέπεται η επαναχρησιμοποίηση του έργου και η δημιουργία παραγώγων αυτού με απλή αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού, και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η δημιουργία παραγώγων του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου και η δημιουργία παραγώγων του. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Συνήθως δεν επιτρέπεται η επαναχρησιμοποίηση του έργου.
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.