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



Σχετικά έγγραφα
ΠΡΟΒΛΗΜΑΤΑ ΤΗΣ ΔΗΜΟΣΙΑΣ ΖΩΗΣ, ΜΙΑ ΨΥΧΑΝΑΛΥΤΙΚΗ ΠΡΟΣΕΓΓΙΣΗ

ΑΚΡΟΒΑΤΗΣ-ΧΑΪΝΗΔΕΣ Οι Χαΐνηδες Ο Δημήτρης Αποστολάκης

ΔΗΜΟΣ ΜΥΚΗΣ ΑΠΟΛΟΓΙΣΜΟΣ ΠΕΠΡΑΓΜΕΝΩΝ ΔΗΜΑΡΧΟΥ ΜΥΚΗΣ ΣΜΙΝΘΗ 18/11/2015

ΓΕΝΙΚΕΣ ΑΡΧΕΣ ΑΧΡΗΜΑΤΗΣ ΚΟΙΝΩΝΙΑΣ

Βασικές Έννοιες και Μέθοδοι της Οικονομικής Επιστήμης - Οικονομία (< οίκος + νέμω): Διαχείριση των Υποθέσεων ενός Νοικοκυριού - Γενικός Ορισμός: Μια

Συνωμοσία Πυρήνων της Φωτιάς - Πυρήνας Αντάρτικου Πόλης


ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙ ΕΥΤΙΚΟ Ι ΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΙΟΙΚΗΣΗΣ ΟΙΚΟΝΟΜΙΑΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

Όταν το μάθημα της πληροφορικής γίνεται ανθρωποκεντρικό μπορεί να αφορά και την εφηβεία.

ΠΡΟΣΩ ΟΛΟΤΑΧΩΣ! ΑΝΑΓΕΝΝΗΣΗ ΤΗΣ ΕΛΛΑΔΑΣ

ΔΕΛΤΙΟ ΤΥΠΟΥ. Ακολουθεί ολόκληρη η τοποθέτηση - παρέμβαση του Υπουργού Δ.Μ.&Η.Δ.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΔΙΔΑΣΚΑΛΕΙΟ ΔΗΜΟΤΙΚΗΣ ΕΚΠΑΙΔΕΥΣΗΣ «ΑΛΕΞΑΝΔΡΟΣ ΔΕΛΜΟΥΖΟΣ» «ΠΑΙΔΙΚΗ ΛΟΓΟΤΕΧΝΙΑ ΚΑΙ ΕΙΔΙΚΗ ΑΓΩΓΗ» ΔΙΔΑΣΚΩΝ: ΔΗΜΗΤΡΗΣ ΚΟΚΚΙΝΟΣ

ΗΜΕΡΟΛΟΓΙΟ 6 Ης ΣΥΝΑΝΤΗΣΗΣ ( )

Aντικειμενοστραφής. Προγραμματισμός. Κληρονομικότητα

Ασυντήρητες και επικίνδυνες οικοδομές

Τοποθέτηση Δημάρχου Γ. Πατούλη. για τεχνικό πρόγραμμα 2010

ΤΕΙ ΗΠΕΙΡΟΥ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΛΟΓΙΣΤΙΚΗΣ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

ΧΙΙΙ Επιτροπή Εκπαιδευτικής Υπηρεσίας

Σοφία Γιουρούκου, Ψυχολόγος Συνθετική Ψυχοθεραπεύτρια

5. Χρηματοδότηση Σ.Α.

Η ΑΣΤΡΟΝΟΜΙΑ ΣΤΗΝ ΑΡΧΑΙΑ ΕΛΛΑΔΑ

ΒΑΣΙΚΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΔΟΜΕΣ ΣΕ ΨΕΥΔΟΚΩΔΙΚΑ ΚΑΙ ΣΕ ΔΡΠ

Συνοπτική Παρουσίαση. Ελλάδα

Δρ.ΠΟΛΥΚΑΡΠΟΣ ΕΥΡΙΠΙΔΟΥ

ΟΣΤΑ & ΣΚΕΛΕΤΙΚΟ ΣΥΣΤΗΜΑ

ΠΕΤΡΟΓΕΦΥΡΑ ΤΟΥ ΝΟΜΟΥ ΤΡΙΚΑΛΩΝ

Στις 22 Σεπτεμβρίου 1937, περί την δεκάτην πρωινήν, ο διευθυντής του ξενοδοχείου «Κεντρικόν» στην Κόρινθο χτύπησε την πόρτα του δωματίου όπου την

Οι Αστερισμοί και πώς να τους βρίσκουμε με το Επιπεδόσφαιρο. Άρης Μυλωνάς

Οι ιοί και οι ιογενείς λοιμώξεις του αναπνευστικού συστήματος στα παιδιά

Φλωρεντία, 10 Δεκεμβρίου 1513 Προς τον: ΦΡΑΓΚΙΣΚΟ ΒΕΤΤΟΡΙ, Πρέσβη της Φλωρεντίας στην Αγία Παπική Έδρα, Ρώμη. Εξοχώτατε Πρέσβη,

Κος ΓΚΑΙΤΛΙΧ: Ευχαριστώ πολύ κυρία Πρόεδρε. Θα επιχειρήσω μέσα σε περίπου 10 με 15 λεπτά να συνοψίσω αυτά που συζητήθηκαν στο δικό μας workshop, το

Αυτός που δεν μπορεί να δει τα μικρά πράγματα είναι τυφλός και για τα μεγαλύτερα. (Κομφούκιος, πχ)

ΚΩΔΙΚΑΣ ΔΕΟΝΤΟΛΟΓΙΑΣ

Εργαστηριακή Άσκηση Αρχές Γλωσσών Προγραμματισμού Εαρινό εξάμηνο 2011

ΑΝΑΚΥΚΛΩΣΗ ΤΗΓΑΝΕΛΑΙΟΥ ΓΙΑΤΙ - ΠΩΣ - ΠΟΤΕ

Ενώνουμε δυνάμεις. Δείγματα Γραφής. Δυναμικά μπροστά ΑΝΔΡΕΑΣ Ζ. ΚΥΠΡΙΑΝΟΥ. Βουλευτής

KATATAΞH APΘPΩN. 6. Αρχές της προσφοράς και προμήθειας, ανθρώπινων ιστών και/ ή κυττάρων

ΣΥΓΚΡΙΣΗ ΣΥΜΒΑΤΙΚΗΣ ΚΑΙ ΜΗΧΑΝΟΠΟΙΗΜΕΝΗΣ ΜΕΘΟΔΟΥ ΣΠΟΡΑΣ ΚΑΙ ΜΕΤΑΦΥΤΕΥΣΗΣ ΣΠΟΡΟΦΥΤΩΝ ΛΑΧΑΝΙΚΩΝ

ΚΑΝΟΝΙΣΜΟΣ ΛΕΙΤΟΥΡΓΙΑΣ

ΦΙΛΟΣΟΦΙΑ ΤΟΥ ΔΙΚΑΙΟΥ. Ενότητα 7: Σχέση δικαίου-ηθικής-πολιτικής. Παρούσης Μιχαήλ. Τμήμα Φιλοσοφίας

ΤΜΗΜΑ ΛΟΓΙΣΤΙΚΗΣ ΚΑΙ ΧΡΗΜΑΤΟΟΙΚΟΝΟΜΙΚΗΣ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥ ΩΝ ΣΤΗΝ ΕΦΑΡΜΟΣΜΕΝΗ ΛΟΓΙΣΤΙΚΗ ΚΑΙ ΕΛΕΓΚΤΙΚΗ. ιπλωµατική Εργασία.

Σηµειώσεις στο ταξινοµούµε

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

ΑΝΑΔΟΧΟΣ: Τ.Ε.Ι. ΚΑΒΑΛΑΣ. 1º ΠΑΡΑΔΟΤΕΟ (τροποποιημένο)

ΜΕ ΤΗ ΔΙΚΗ ΜΟΥ ΒΟΗΘΕΙΑ, ΤΟΥ ΑΥΤΟΚΡΑΤΟΡΙΚΟΥ ΚΗΠΟΥΡΟΥ ΔΗΛΑΔΗ, ΘΑ ΤΑ ΚΑΛΛΙΕΡΓΗΣΕΤΕ...

Οι Πνευματικές Δυνάμεις στο Σύμπαν

1. Εισαγωγή. 2. Καταπολέμηση της φοροδιαφυγής

Από το ξεκίνημά του ο ΤΙΤΑΝ εκφράζει

ΕΘΙΜΑ ΤΟΥ ΚΟΣΜΟΥ. Αγγελική Περιστέρη Α 2

θεωρητική και εθνογραφική τεκμηρίωση ορίων και σχέσεων των μουσικών δικτύων του σύγχρονου πανηγυριού

Υποψήφιοι Σχολικοί Σύμβουλοι

ΑΝΑΝΕΩΣΙΜΕΣ ΠΗΓΕΣ ΕΝΕΡΓΕΙΑΣ (Α.Π.Ε)

03-00: Βιομάζα για παραγωγή ενέργειας Γενικά ζητήματα εφοδιαστικών αλυσίδων

: Aύξηση φόρου εισοδήµατος, και µείωση µισθών

Το Βαρόμετρο του Παρατηρητηρίου: Ποιότητα των Δημόσιων Υπηρεσιών προς Επιχειρήσεις

11. Προϋπολογισμός Προϋπολογισμός και αποδοτικότητα δημοσίων υπηρεσιών: υφιστάμενη κατάσταση

Προδημοσιεύτηκαν τα τέσσερις πρώτα προγράμματα του νέου ΕΣΠΑ που αφορούν

Ξεσκαρτάρισμα. Παίζοντας 1 Κάρτα

ΠΡΟΣΚΛΗΣΗ. των Τοπικών Προϊόντων. του Δήμου Σητείας. «Σητείας Γη»

Ο αρτινός συγγραφέας Γιάννης Καλπούζος, μιλάει στην «Γ», με την ευκαιρία της έκδοσης του νέου του βιβλίου

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΝΑΥΠΗΓΩΝ ΜΗΧ/ΓΩΝ ΜΗΧΑΝΙΚΩΝ. ΘΕΜΑ: Προστασία µε επιµεταλλώσεις. Σκαβάρας Παναγιώτης

ΔΙΑΚΗΡΥΞΗ ΔΗΜΟΠΡΑΣΙΑΣ

ΣΥΜΒΑΣΗ ΔΠΑ/ΕΠ-6489/2012

...ακολουθώντας τη ροή... ένα ημερολόγιο εμψύχωσης

Leica ST5020. Multistainer. Συνοδευτικό φυλλάδιο Διαβάστε το προσεκτικά πριν από τη θέση σε λειτουργία

Βασικά σημεία διάλεξης

Βουλευτικές Εκλογές 2011

" Συμμετοχή στήν ψαλτή λατρεία"

Δασικά Οικοσυστήματα και Τεχνικά Έργα

5 η Ενότητα Κουλτούρα και στρατηγική

ΚΩ ΙΚΑΣ ΕΟΝΤΟΛΟΓΙΑΣ ΤΗΣ ΕΤΑΙΡΕΙΑΣ ΜΕ ΤΗΝ ΕΠΩΝΥΜΙΑ «ΠΑΠΟΥΤΣΑΝΗΣ ΑΝΩΝΥΜΗ ΒΙΟΜΗΧΑΝΙΚΗ ΚΑΙ ΕΜΠΟΡΙΚΗ ΕΤΑΙΡΕΙΑ ΚΑΤΑΝΑΛΩΤΙΚΩΝ ΑΓΑΘΩΝ»

ΣΥΣΤΗΜΑ ΔΙΑΓΝΩΣΗΣ ΑΝΑΓΚΩΝ ΑΓΟΡΑΣ ΕΡΓΑΣΙΑΣ ΠΑΡΑΔΟΤΕΟ ΕΘΝΙΚΟΥ ΜΗΧΑΝΙΣΜΟΥ

Πρόγραμμα Σπουδών για το "Νέο Σχολείο"

Ένας περίπατος στη Μονή Καισαριανής

Χρηματοδότηση των Συλλόγων στην εποχή της κρίσης

Κύριε υπουργέ και όσοι υπάλληλοι βαθμολογούνται κάτω από τη βάση θα απολύονται;

Θεµατικές ενότητες: παρεµβάσεις και ενδεικτικές υποθέσεις. 1. Οικονοµική πολιτική. Παρεµβάσεις οικονοµικού χαρακτήρα

Έρευνα Καταναλωτικής Εμπιστοσύνης

ΕΦΑΡΜΟΣΜΕΝΗ ΗΘΙΚΗ. Ενότητα 10: Φιλοσοφική Συμβουλευτική. Παρούσης Μιχαήλ. Τμήμα Φιλοσοφίας

Αρωματικά φυτά της Ελλάδας

1. Εισαγωγή στην πλατφόρμα

Ομιλία του Υφυπουργού Ανάπτυξης κου Θανάση Σκορδά στο CapitalVision 2012

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Οι 21 όροι του Λένιν

Οργάνωση και λειτουργία του δικτυακού τόπου του Εθνικού Αστεροσκοπείου Αθηνών Προγνώσεις και παρατηρήσεις

Α. ΟΡΓΑΝΑ ΣΧΕΔΙΑΣΜΟΥ ΚΑΙ ΕΦΑΡΜΟΓΗΣ

Η Ψυχοπαθολογία του Πολιτικού Του Φ.Μωρόγιαννη *

Αξιοποιούμε το χαλκό με γνώμονα τον άνθρωπο

Μέθοδοι διαχωρισμού των συστατικών ενός ετερογενούς μείγματος

μήπως η τελευταία φορά;

ΔΕΛΤΙΟ ΤΥΠΟΥ. Ελλείψεις στο φορολογικό νομοσχέδιο. Σοβαρές ελλείψεις στη νέα μορφή του φορολογικού νομοσχεδίου

ΠΡΟΣΛΗΨΕΙΣ ΚΑΙ ΕΙΚΟΝΕΣ ΤΗΣ ΕΛΛΑΔΑΣ

ΤΙΜΟΛΟΓΙΟ ΜΕΛΕΤΗΣ ΕΛΛΗΝΙΚΗ ΗΜΟΚΡΑΤΙΑ ΥΠΟΥΡΓΕΙΟ ΠΑΙ ΕΙΑΣ ΚΑΙ ΘΡΗΣΚΕΥΜΑΤΩΝ «ΥΓΡΟΜΟΝΩΣΕΙΣ ΕΡΓΟ:

η ΑΚΡΟΠΟΛΗ του ΜΕΓΑΛΟΥ ΓΑΡΔΙΚΙΟΥ Ο λόφος «Καστρί» στο βόρειο τμήμα του λεκανοπεδίου των Ιωαννίνων.

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Τ.Ε.Ι. ΚΑΒΑΛΑΣ ΣΧΟΛΗ Σ.Δ.0. ΤΜΗΜΑ ΔΙΟΙΚΗΣΗ ΕΠΙΧΕΙΡΗΣΕΩΝ. ΘΕΜΑ: Πόσο εφικτή είναι η προσχώριση της Τουρκίας στην Ευρωπαϊκή Ένωση;

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

ΓΕΝΙΚΗ ΕΦΟΡΕΙΑ. Αθήνα, 15 Απριλίου 2011 ΕΓΚΥΚΛΙΟΣ 7. - Αρχηγούς Συστημάτων και Τμημάτων - Περιφερειακούς και Τοπικούς Εφόρους - Εφόρους Περιοχής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΚΟΙΝΩΝΙΟΛΟΓΙΑΣ ΜΑΘΗΜΑ ΣΥΓΚΡΙΤΙΚΗ ΚΟΙΝΩΝΙΟΛΟΓΙΑ ΔΙΕΥΘΥΝΤΗΣ ΜΑΡΑΓΚΟΥΔΑΚΗΣ ΜΑΝΟΥΣΟΣ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΕΡΙΦΕΡΕΙΑ ΚΡΗΤΗΣ Λιμάνι Χερσονήσου ΝΟΜΟΣ ΗΡΑΚΛΕΙΟΥ Αριθμός πρωτ ΔΗΜΟΣ ΧΕΡΣΟΝΗΣΟΥ ΔΗΜΑΡΧΙΑΚΗ ΕΠΙΤΡΟΠΗ

Ο Υφυπουργός κατά την επίσκεψή του στο νέο κτίριο, ανακοίνωσε τα

Transcript:

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

Πίνακες Αντικειμένων Όπως στην C μπορούμε να έχουμε πίνακες από δομές, έτσι και στην C++ μπορούμε να έχουμε πίνακες αντικειμένων. 1 class cl { 2 int param ; 3 public : 4 cl ( int j ) { param = j ; 5 int getparam ( ) { return param ; 6 ; 7 8 int main ( ) { 9 cl ob [ 3 ] = { cl ( 1 ), cl ( 2 ), cl ( 3 ) ; / / i n i t i a l i z e r s 10 11 for ( int i = 0 ; i < 3 ; i++) 12 cout << ob [ i ]. getparam ( ) << endl ; 13 Παραπάνω φαίνεται επίσης πως καλούμε τους constructors κάθε αντικειμένου. Για να μην δώσετε και τους initializers πρέπει η κλάση να παρέχει ένα constructor που να μην δέχεται παραμέτρους. Χαροκόπειο Πανεπιστήμιο 2/50

Δείκτες Αντικειμένων Όπως έχουμε δείκτες σε άλλους τύπους μεταβλητών, μπορούμε να έχουμε και δείκτες σε αντικείμενα. Όπως και στις εγγραφές για να προσπελάσουμε τα μέλη ενός αντικειμένου μέσω ενός δείκτη πρέπει να χρησιμοποιήσουμε τον τελεστή βέλους (->). 1 class cl { 2 int param ; 3 public : 4 cl ( int j ) { param = j ; 5 int getparam ( ) { return param ; 6 ; 7 8 int main ( ) { 9 cl ob ( 8 8 ), *p ; 10 11 p = &ob ; 12 13 cout << p >getparam ( ) << endl ; 14 Χαροκόπειο Πανεπιστήμιο 3/50

Ο δείκτης this Όταν μια συνάρτηση μέλος μια κλάσης καλείται σε ένα αντικείμενο, έχει αυτόματη πρόσβαση σε ένα δείκτη this που δείχνει στο αντικείμενο αυτό. 1 class cl { 2 int param ; 3 public : 4 cl ( int j ) { 5 this >param = j ; 6 7 int getparam ( ) { 8 return this >param ; 9 10 ; Στην παραπάνω περίπτωση η χρήση αυτή δεν είναι απαραίτητη και μπορεί να παραληφθεί ο δείκτης this. Υπάρχουν όμως περιπτώσεις όπου ο δείκτης αυτός είναι πολύ χρήσιμος. Χαροκόπειο Πανεπιστήμιο 4/50

Αναφορές Η C++ μας παρέχει την έννοια των αναφορών που χρησιμοποιείται σε 3 περιπτώσεις:.1 ως παράμετρος σε συνάρτηση.2 ως τύπος επιστροφής από συνάρτηση.3 ως ανεξάρτητη αναφορά Χαροκόπειο Πανεπιστήμιο 5/50

Κλήση μέσω Αναφοράς Η πιο σημαντική εφαρμογή των αναφορών είναι μάλλον η δυνατότητα να δημιουργήσουμε συναρτήσεις που χρησιμοποιούν αυτόματα "κλήση μέσω αναφοράς". 11 void neg ( int &i ) { 12 i = i ; 13 14 15 int main ( ) { 16 int x = 10; 17 18 cout << x << " negated is " ; 19 20 neg ( x ) ; 21 22 cout << x << endl ; 23 Χαροκόπειο Πανεπιστήμιο 6/50

Κλήση μέσω Αναφοράς Η πιο σημαντική εφαρμογή των αναφορών είναι μάλλον η δυνατότητα να δημιουργήσουμε συναρτήσεις που χρησιμοποιούν αυτόματα "κλήση μέσω αναφοράς". 24 void swap ( int &x, int &y ) { 25 int tmp = x ; 26 x = y ; 27 y = tmp ; 28 29 30 int main ( ) { 31 int x = 10, y = 20; 32 33 swap ( x, y ) ; 34 35 cout << "x = " << x << ", y = " << y << endl ; 36 Χαροκόπειο Πανεπιστήμιο 7/50

Αντικείμενα ως Παράμετροι Εαν καλέσουμε μια συνάρτηση με παράμετρο ένα αντικείμενο, δημιουργείται ένα αντίγραφο του αντικειμένου. Στο τέλος της συνάρτησης το αντίγραφο αυτό καταστρέφεται κανονικά. class cl { int id ; public : cl ( int i ) { id = i ; cout << "Constructing id = " << id << endl ; ~cl ( ) { cout << "Destructing id = " << id << endl ; ; void print ( cl o ) { / / no reference, copy void print1 ( cl& o ) { / / reference, no copy int main ( ) { cl obj ( 2 ) ; print ( obj ) ; print1 ( obj ) ; Χαροκόπειο Πανεπιστήμιο 8/50

Αντικείμενα ως Παράμετροι Με την χρήση αναφοράς δεν δημιουργείται αντίγραφο. class cl { int id ; public : cl ( int i ) { id = i ; cout << "Constructing id = " << id << endl ; ~cl ( ) { cout << "Destructing id = " << id << endl ; ; void print ( cl o ) { / / no reference, copy void print1 ( cl& o ) { / / reference, no copy int main ( ) { cl obj ( 2 ) ; print ( obj ) ; print1 ( obj ) ; Χαροκόπειο Πανεπιστήμιο 8/50

Αναφορές ως Τύπος Επιστροφής Συνάρτησης Μια συνάρτηση μπορεί να επιστρέψει αναφορά. Το παράξενο γεγονός είναι πως με αυτόν τον τρόπο μπορεί μια συνάρτηση να χρησιμοποιηθεί στην αριστερή πλευρά μιας ανάθεσης. Πρέπει όμως πάντα να προσέχουμε πως η αναφορά πρέπει να αναφέρεται σε ένα αντικείμενο που δεν βγαίνει εκτός scope με το τέλος της συνάρτησης. Χαροκόπειο Πανεπιστήμιο 9/50

Αναφορές ως Τύπος Επιστροφής Συνάρτησης Μια συνάρτηση μπορεί να επιστρέψει αναφορά. #include <iostream > using namespace std ; char s [ 8 0 ] = "Hello There" ; char& replace ( int i ) / / r e t u r n a r e f e r ence { return s [ i ] ; int main ( ) { replace ( 5 ) = 'X' ; cout << s << endl ; Χαροκόπειο Πανεπιστήμιο 10/50

Ανεξάρτητες Αναφορές Μπορούμε να δημιουργήσουμε ανεξάρτητες αναφορές, οι οποίες είναι απλά ψευδώνυμα για άλλες μεταβλητές. int main ( ) { int a ; int &ref = a ; / / independent r e f e r e nce a = 10; cout << a << " " << ref << endl ; ref = 100; cout << a << " " << ref << endl ; int b = 19; ref = b ; / / put b ' s value o f i n t o a cout << a << " " << ref << endl ; ref ; / / decrement a ref ; / / again cout << a << " " << ref << endl ; Χαροκόπειο Πανεπιστήμιο 11/50

Δυναμική Μνήμη στην C++ Η C++ παρέχει δύο τελεστές για δυναμική δέσμευση μνήμης: new και delete. Για λόγους συμβατότητας η C++ υποστηρίζει και τις συναρτήσεις malloc() και free(). Είναι προτιμότερο όμως να χρησιμοποιούμε την μέθοδο της C++ για δέσμευση και ελευθέρωση δυναμικής μνήμης. Χαροκόπειο Πανεπιστήμιο 12/50

Δυναμική Μνήμη Ο τελεστής new δεσμεύει μνήμη και χρησιμοποιείται ως εξής: p_var = new type; Εδώ p_var είναι μια μεταβλητή τύπου δείκτη. Αντίστοιχα η διαγραφή της μνήμης γίνεται με τον τελεστή delete. delete p_var; Χαροκόπειο Πανεπιστήμιο 13/50

Δυναμική Μνήμη Παράδειγμα class complex { double a, b ; public : complex ( ) { this >a = 0. 0 ; this >b = 0. 0 ; complex ( double a, double b ) { this >a = a ; this >b = b ; ~complex ( ) ; ; double re ( ) { return a ; double im ( ) { return b ; int main ( ) { complex* c = new complex ; / / do something delete c ; Χαροκόπειο Πανεπιστήμιο 14/50

Πλεονεκτήματα new σε σχέση με malloc.1 η new αυτόματα δεσμεύει τον απαραίτητο χώρο για την αποθήκευση ενός τύπου χωρίς να χρειάζεται να δώσουμε το μέγεθος του τύπου μέσω του τελεστή sizeof..2 η new επιστρέφει ένα δείκτη στον τύπο που ζητήσαμε και άρα δεν χρειάζεται να γίνει κάποιο cast..3 οι τελεστές new και delete μπορούν να υπερφορτωθούν ώστε να δημιουργήσουμε δικά μας συστήματα δέσμευσης μνήμης. Χαροκόπειο Πανεπιστήμιο 15/50

Αρχικοποίηση Δυναμικής Μνήμης Μπορούμε να αρχικοποιήσουμε την δεσμευμένη μνήμη με κάποια τιμή. Πρέπει βέβαια να υπάρχει και constructor που να υποστηρίζει αυτήν την τιμή. int main ( ) { complex* c = new complex ( 2, 5 ) ; / / do something delete c ; Χαροκόπειο Πανεπιστήμιο 16/50

Αρχικοποίηση Δυναμικής Μνήμης Μπορούμε να αρχικοποιήσουμε την δεσμευμένη μνήμη με κάποια τιμή. int main ( ) { int *d = new int ( 5 ) ; / / i n i t i a l i z e t o 5 / / do something delete d ; Χαροκόπειο Πανεπιστήμιο 17/50

Δυναμικοί Πίνακες Για να δεσμεύσουμε μνήμη δυναμικά για πίνακες χρησιμοποιούμε την γενική μορφή: p_var = new array_type [size]; και για να διαγράψουμε την μνήμη του πίνακα: delete [] pvar; Χαροκόπειο Πανεπιστήμιο 18/50

Δυναμικοί Πίνακες #include <iostream > using namespace std ; int main ( ) { int *p = new int [ 1 0 ] ; for ( int i = 0 ; i < 10; i++) p [ i ] = i ; for ( int i = 0 ; i < 10; i++) cout << p [ i ] << " " ; delete [ ] p ; Όταν δεσμεύουμε δυναμικά πίνακες, υπάρχει ο περιορισμός πως δεν μπορούμε να δώσουμε αρχικές τιμές. Αυτό σημαίνει πως αν θέλουμε ένα δυναμικό πίνακα με αντικείμενα, πρέπει η αντίστοιχη κλάση να περιέχει έναν constructor χωρίς παραμέτρους. Χαροκόπειο Πανεπιστήμιο 19/50

Έλεγχος Επιτυχής Δέσμευσης Εξαιρέσεις Η C++ χρησιμοποιεί ένα καινούριο μηχανισμό για να μας ενημερώσει πως η δέσμευση μνήμης δεν ήταν επιτυχής, τις εξαιρέσεις. θα κάνουμε μια μικρή παρένθεση ώστε να εξηγήσουμε λίγο την έννοια των εξαιρέσεων. Χαροκόπειο Πανεπιστήμιο 20/50

Εξαιρέσεις Exceptions Οι εξαιρέσεις είναι ένας σύγχρονως τρόπος ενημέρωσης για λάθοι. Στην C++ η διαχείριση εξαιρέσεων χρησιμοποιεί 3 δεσμευμένες λέξεις: try catch throw Χαροκόπειο Πανεπιστήμιο 21/50

Εξαιρέσεις Exceptions Στην C++ η διαχείριση εξαιρέσεων χρησιμοποιεί 3 δεσμευμένες λέξεις: συνήθως οι εντολές που θέλουμε να παρακολουθούμε για εξαιρέσεις εκτελούνται μέσα σε ένα try block. εάν μια εξαίρεση (ένα λάθος) συμβεί μέσα στο try block, λέμε πως πετάχτηκε μια εξαίρεση (με την χρήση της throw). η εξαίρεση πιάνετε με την χρήση της catch Χαροκόπειο Πανεπιστήμιο 22/50

Γενική Μορφή try try { // try block catch( type1 arg ) { // catch block catch( type2 arg ) { // catch block... catch( typen arg ) { // catch block Χαροκόπειο Πανεπιστήμιο 23/50

Γενική Μορφή try Όταν μια εξαίρεση πεταχτεί μέσα στο try block, πιάνεται από το αντίστοιχο catch block που εκτελεί κώδικα ώστε να διαχειριστεί την εξαίρεση. Πιο catch block θα εκτελεστεί εξαρτάται από τον τύπο της εξαίρεσης. Ο τύπος μπορεί να είναι οποιοσδήποτε, ακόμη και κλάσης που έχετε φτιάξει εσείς. Εαν ο κώδικας δεν πετάξει καμία εξαίρεση, δεν εκτελείται κανένα catch. Χαροκόπειο Πανεπιστήμιο 24/50

Γενική Μορφή throw throw exception; Εαν μια εξαίρεση πρέπει να πιαστεί, το throw πρέπει να κληθεί μέσα σε ένα try, ή μέσα σε μια συνάρτηση που κλήθηκε μέσε σε ένα try. Εαν δεν υπάρχει αντίστοιχο catch για τον τύπο της εξαίρεσης τότε το πρόγραμμα τερματίζει. Η τυπική βιβλιοθήκη καλεί την συνάρτηση terminate() η οποία με την σειρά της καλεί την συνάρτηση abort(). Υπάρχει βέβαια η δυνατότητα να αλλάξετε αυτή την διαδικασία και να καλέσετε δικιά σας συνάρτηση. Χαροκόπειο Πανεπιστήμιο 25/50

Παράδειγμα #include <iostream > using namespace std ; int main ( ) { cout << "Start" << endl ; try { cout << "Inside try block" << endl ; throw 100; cout << "This will not execute" << endl ; catch ( int i ) { / / catch exception o f type i n t cout << "Caught an exception -- value is " << i << endl ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 26/50

Παράδειγμα Το προηγούμενο πρόγραμμα τυπώνει: Start Inside try block Caught an exception -- value is 100 End Χαροκόπειο Πανεπιστήμιο 27/50

Παράδειγμα Εαν πετάξουμε εξαίρεση που δεν υπάρχει αντίστοιχο catch, π.χ μια εξαίρεση τύπου double #include <iostream > using namespace std ; int main ( ) { cout << "Start" << endl ; try { cout << "Inside try block" << endl ; throw 1 0 0. 0 ; cout << "This will not execute" << endl ; catch ( int i ) { / / catch exception o f type i n t cout << "Caught an exception -- value is " << i << endl ; cout << "End" << endl ; το πρόγραμμα θα τερματίσει. Χαροκόπειο Πανεπιστήμιο 28/50

Παράδειγμα Το προηγούμενο πρόγραμμα τυπώνει: Start Inside try block terminate called after throwing an instance of 'double' Aborted Χαροκόπειο Πανεπιστήμιο 29/50

Εξαιρέσεις μέσα σε συναρτήσεις #include <iostream > using namespace std ; void Xhandler ( int test ) { try { if ( test ) throw test ; catch ( int i ) { cout << "Caught Exception #: " << i << endl ; int main ( ) { cout << "Start" << endl ; Xhandler ( 1 ) ; Xhandler ( 2 ) ; Xhandler ( 0 ) ; Xhandler ( 3 ) ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 30/50

Εξαιρέσεις μέσα σε συναρτήσεις Το προηγούμενο πρόγραμμα τυπώνει: Start Caught Exception #: 1 Caught Exception #: 2 Caught Exception #: 3 End Χαροκόπειο Πανεπιστήμιο 31/50

Εξαιρέσεις μέσα σε συναρτήσεις #include <iostream > using namespace std ; void Xtest ( int test ) { cout << "Inside Xtest, test is: " << test << endl ; if ( test ) throw test ; int main ( ) { cout << "Start" << endl ; try { cout << "Inside try block" << endl ; Xtest ( 0 ) ; Xtest ( 1 ) ; Xtest ( 2 ) ; catch ( int i ) { cout << "Caught an exception -- value is " << i << endl ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 32/50

Εξαιρέσεις μέσα σε συναρτήσεις Το προηγούμενο πρόγραμμα τυπώνει: Start Inside try block Inside Xtest, test is: 0 Inside Xtest, test is: 1 Caught an exception -- value is 1 End Χαροκόπειο Πανεπιστήμιο 33/50

Πιάνοντας Κλάσεις Μια εξαίρεση μπορεί να είναι οποιαδήποτε τύπου. Σε πραγματικά προγράμματα οι εξαιρέσεις είναι συνήθως κάποια κλάση. #include <iostream > #include < c s t r i n g > using namespace std ; class MyException { char str_what [ 8 0 ] ; int what ; public : MyException ( ) { *str_what = 0 ; what = 0 ; MyException ( char *s, int e ) { strcpy ( str_what, s ) ; what = e ; int What ( ) { return what ; char* StrWhat ( ) { return str_wat ; Χαροκόπειο Πανεπιστήμιο 34/50

Πιάνοντας Κλάσεις Μια εξαίρεση μπορεί να είναι οποιαδήποτε τύπου. Σε πραγματικά προγράμματα οι εξαιρέσεις είναι συνήθως κάποια κλάση. int main ( ) { int i ; try { cout << "Enter a positive number: " ; cin >> i ; if ( i < 0) throw MyException ( "Not Positive", i ) ; catch ( MyException e ) { cout << e. Str_What ( ) << ": " << e. What ( ) << endl ; Enter a positive number: -4 Not Positive: -4 Χαροκόπειο Πανεπιστήμιο 35/50

Πολλά catch #include <iostream > using namespace std ; void Xhandler ( int test ) { try { if ( test ) throw test ; else throw "Value is zero" ; catch ( int i ) { cout << "Caught Exception #: " << i << endl ; catch ( const char * str ) { cout << "Caught a string: " << str << endl ; int main ( ) { cout << "Start" << endl ; Xhandler ( 1 ) ; Xhandler ( 2 ) ; Xhandler ( 0 ) ; Xhandler ( 3 ) ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 36/50

Πολλά catch Το προηγούμενο πρόγραμμα τυπώνει: Start Caught Exception #: 1 Caught Exception #: 2 Caught a string: Value is zero Caught Exception #: 3 End Χαροκόπειο Πανεπιστήμιο 37/50

Πιάνοντας όλες τις Εξαιρέσεις Για να γράψουμε ένα catch που να πιάνει τα πάντα μπορούμε να χρησιμοποιήσουμε την εξής μορφή: catch(...) { // process all exceptions Χαροκόπειο Πανεπιστήμιο 38/50

Πιάνοντας όλες τις Εξαιρέσεις #include <iostream > using namespace std ; void Xhandler ( int test ) { try { if ( test == 0) throw test ; if ( test == 1) throw 'a' ; if ( test == 2) throw 1. 3 3 ; catch (... ) { cout << "Caught Exception!" << endl ; int main ( ) { cout << "Start" << endl ; Xhandler ( 0 ) ; Xhandler ( 1 ) ; Xhandler ( 2 ) ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 39/50

Πιάνοντας όλες τις Εξαιρέσεις Το προηγούμενο πρόγραμμα τυπώνει: Start Caught Exception! Caught Exception! Caught Exception! End Χαροκόπειο Πανεπιστήμιο 40/50

Πιάνοντας όλες τις Εξαιρέσεις #include <iostream > using namespace std ; void Xhandler ( int test ) { try { if ( test == 0) throw test ; if ( test == 1) throw 'a' ; if ( test == 2) throw 1. 3 3 ; catch ( int i ) { cout << "Caught an integer" << endl ; catch (... ) { cout << "Caught Other Exception!" << endl ; int main ( ) { cout << "Start" << endl ; Xhandler ( 0 ) ; Xhandler ( 1 ) ; Xhandler ( 2 ) ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 41/50

Πιάνοντας όλες τις Εξαιρέσεις Το προηγούμενο πρόγραμμα τυπώνει: Start Caught an integer Caught Other Exception! Caught Other Exception! End Χαροκόπειο Πανεπιστήμιο 42/50

Προσδιορίζοντας τις Εξαιρέσεις Μπορούμε να δηλώσουμε ρητά τους τύπους των εξαιρέσεων που μπορεί να πετάξει μια συνάρτηση. ret-type func-name(arg-list) throw(type-list) { //... Εαν η συνάρτηση πετάξει οτιδήποτε που δεν ανήκει στην λίστα αυτή, η συνάρτηση unexpected() της τυπικής βιβλιοθήκης θα κληθεί. Η συνάρτηση αυτή όπως και η terminate() καλεί την abort(). Είναι όμως δυνατόν να αλλάξουμε αυτή την συμπεριφορά. Χαροκόπειο Πανεπιστήμιο 43/50

Επαναπέταγμα μιας Εξαίρεσης Μέσα σε ένα catch block μπορούμε να επαναπετάξουμε μια εξαίρεση. Αυτό είναι χρήσιμο εαν θέλουμε να διαχειριστούμε ένα λάθος τμηματικά. Για να συμβεί αυτό καλούμε την throw χωρίς παραμέτρους. Η εξαίρεση δεν θα πιαστεί από το ίδιο catch. Χαροκόπειο Πανεπιστήμιο 44/50

Επαναπέταγμα μιας Εξαίρεσης #include <iostream > using namespace std ; void Xhandler ( ) { try { throw "hello" ; catch ( const char * ) { cout << "Caught char * inside Xhandler" << endl ; throw ; / / rethrow out o f f u n c t i o n int main ( ) { cout << "Start" << endl ; try { Xhandler ( ) ; catch ( const char * ) { cout << "Caught char * inside main" << endl ; cout << "End" << endl ; Χαροκόπειο Πανεπιστήμιο 45/50

Επαναπέταγμα μιας Εξαίρεσης Το προηγούμενο πρόγραμμα τυπώνει: Start Caught char * inside Xhandler Caught char * inside main End Χαροκόπειο Πανεπιστήμιο 46/50

Επιστροφή στην Δυναμική Μνήμη Εξαίρεση bad_alloc Εαν για κάποιο λόγο δεν βρεθεί ο απαραίτητος χώρος που ζητήθηκε με την χρήση της new, η new πετάει την εξαίρεση bad_alloc. Η εξαίρεση αυτή είναι ορισμένη στο αρχείο επικεφαλίδας <new>. Χαροκόπειο Πανεπιστήμιο 47/50

Εξαίρεση bad_alloc #include <iostream > #include <new> using namespace std ; int main ( ) { int *p ; try { p = new int ; catch ( bad_alloc xa ) { cout << "Allocation failure" << endl ; return 1 ; *p = 100; cout << "At " << p << " is the value " << * p << endl ; delete p ; Χαροκόπειο Πανεπιστήμιο 48/50

Η Επιλογή nothrow Για να παρέχει η C++ πιο εύκολη μετάβαση από την C μας παρέχει και μια μορφή της new η οποία επιστρέφει null όταν η δέσμευση μνήμης αποτύχει. p_var = new(nothrow) type; Για την χρήση αυτής της μορφής πρέπει να κάνετε include το αρχείο επικεφαλίδας <new>. Χαροκόπειο Πανεπιστήμιο 49/50

Η Επιλογή nothrow #include <iostream > #include <new> using namespace std ; int main ( ) { int *p ; p = new ( nothrow ) int ; if (! p ) { cout << "Allocation failure" << endl ; return 1 ; *p = 100; cout << "At " << p << " is the value " << * p << endl ; delete p ; Χαροκόπειο Πανεπιστήμιο 50/50