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

Σχετικά έγγραφα
Δομές Δεδομένων Standard Template Library (STL) 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

Standard Template Library (STL) C++ library

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

Standard Template Library (STL)

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

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

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

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Δείκτες Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Τεχνολογίες Υλοποίησης Αλγορίθµων

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

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

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

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

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

Περιεχόμενα. Λίγα λόγια για αυτή την έκδοση... 23

JDSL Java Data Structures Library

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

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

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

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

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

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

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

Διαδικασιακός Προγραμματισμός

19. ΠΡΟΤΥΠΑ (TEMPLATES)

Διαδικασιακός Προγραμματισμός

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

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

Streams Input / Output in C++ George Kastrinis

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Boost - Boost Graph Library C++ library

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

Διάλεξη 6: Δείκτες και Πίνακες

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

Διαδικασιακός Προγραμματισμός

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

Αλγόριθμοι Ταξινόμησης Μέρος 1

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

Week. 6: Java Collections

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

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

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

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

Δομές Δεδομένων Boost C++ Libraries. 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

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

Τεχνολογίες Υλοποίησης Αλγορίθµων

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED αντικειμενοστραφής προγραμματισμός ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

Διάλεξη 1: Δομές Δεδομένων και Αλγόριθμοι - Εισαγωγή. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Πληροφορική 2. Γλώσσες Προγραμματισμού

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

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

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Διαδικασιακός Προγραμματισμός

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

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

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

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

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

ιαφάνειες παρουσίασης #5 (β)

Δομές Δεδομένων. Λουκάς Γεωργιάδης.

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Μεθόδων Επίλυσης Προβλημάτων

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

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

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

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

ΑΣΚΗΣΗ 1. Structural Programming

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Σύνθεση και Κληρονομικότητα

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Transcript:

Πέρασμα μεταβλητών, Templates, Συσχετίσεις μεταξύ κλάσεων ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++ Μ. Ρήγκου (rigou@ceid.upatras.gr)

Τι θα συζητήσουμε σήμερα Πέρασμα με τιμή και με αναφορά Template functions και classes STL Vector List Σχέσεις μεταξύ κλάσεων Κληρονομικότητα Απλή συσχέτιση Συνάθροιση/συναρμολόγηση Σύνθεση

Πέρασμα ορίσματος με τιμή Εξ ορισμού μηχανισμός στη C++ Αν μια μεταβλητή αλλάξει τιμή μέσα σε μια συνάρτηση η τιμή της δεν έχει αλλάξει όταν βγούμε εκτός εμβέλειας της συνάρτησης αυτής

Δείκτης σαν όρισμα συνάρτησης int *x; int y; &y // διεύθυνση του y *x // τιμή που δείχνεται από το x // (de-referencing: από-αναφοροποίηση) int myvar; int *myptr = &myvar; *myptr=9; Ποια είναι η τιμή του myvar? Πέρασμα με αναφορά

Πέρασμα ορίσματος με αναφορά Η C++ μας επιτρέπει να υλοποιήσουμε πέρασμα με αναφορά χωρίς δείκτες Δε μπορούμε να υπερφορτώσουμε την ίδια συνάρτηση με πέρασμα με τιμή και με αναφορά fn(int) και fn(int&)

Ας περάσουμε στα αντικείμενα: Πίνακας αντικειμένων ;

Δείκτες προς αντικείμενα Λειτουργούν όπως και οι δείκτες προς απλούς τύπους δεδομένων (int, char, κτλ.)

Από-αναφοροποίηση δείκτη σε αντικείμενα Δε λειτουργεί σωστά επειδή ο τελεστής (.) έχει προτεραιότητα σε σχέση με τον (*), δηλαδή πρακτικά: *(ps.gpa) Άρα για να λειτουργήσει ο κώδικας (*ps).gpa Είναι δύσχρηστο να χρησιμοποιούμε (*ps).gpa ενώ είναι πολύ πιο διαισθητικό το ps->gpa

Κλήση συνάρτησης με τιμή αντικειμένου

Κλήση συνάρτησης με δείκτη σε αντικείμενο

Κλήση συνάρτησης με τον τελεστή αναφοράς Ίδια έξοδος όπως στην κλήση με δείκτη

Γιατί χρειάζεται να χρησιμοποιούμε πέρασμα με αναφορά; Η C++ υλοποιεί πέρασμα με τιμή όταν δίνουμε σαν όρισμα ένα αντικείμενο Άρα δε μπορούμε να αλλάξουμε το αντικείμενο-όρισμα, αφού η καλούσα συνάρτηση χρησιμοποιεί ένα αντίγραφό του Ένα αντικείμενο μπορεί να είναι μεγάλο σε μέγεθος και η αντιγραφή του να επιβαρύνει πολύ τους πόρους του συστήματος ιδιαίτερα αν η συνάρτηση που το έχει όρισμα καλεί κι άλλες συναρτήσεις (και άρα το αντικείμενο ξανα-αντιγράφεται) Η αντιγραφή ενός δείκτη ή μιας αναφοράς είναι πολύ γρήγορη ένας δείκτης είναι 4 bytes, ανεξάρτητα από το αντικείμενο στο οποίο δείχνει

TEMPLATES Template functions και template classes

Γιατί χρειάζονται τα templates; Υπάρχουν συναρτήσεις που μπορούν να εφαρμοστούν σε διάφορους τύπους δεδομένων Μια λύση: Υπερφόρτωση: Γράφουμε τον ίδιο κώδικα τόσες φορές όσοι οι τύποι ορισμάτων που θέλουμε να λειτουργούν με τη συνάρτηση

Μια καλύτερη λύση: Templates Τα templates μας επιτρέπουν να γράψουμε συναρτήσεις που χρησιμοποιούν έναν ή περισσότερους type holders Οι type holders μετατρέπονται σε true types κατά το compiling

Τemplates κλάσεων Ακολουθεί τον ορισμό μιας τυπικής κλάσης αλλά χρησιμοποιεί placeholder για κάποιες άγνωστες βοηθητικές κλάσεις templatevector.h

Class templates: χρήση

Διευκρινήσεις για τα templates Δεν παράγεται κώδικας για ένα template O κώδικας παράγεται αφού δημιουργήσουμε ένα στιγμιότυπο του template δηλ. κατασκευάσουμε μια συγκεκριμένη κλάση ή συνάρτηση από αυτό Για το λόγο αυτό σχεδόν πάντα ο ορισμός ενός class template μπαίνει σε.h αρχείο με τον κώδικα όλων των member functions Ένα class template δεν καταναλώνει μνήμη αν δεν παραχθούν συγκεκριμένες κλάσεις Ένα template δε γίνεται compiled μέχρι να μετατραπεί σε κλάση (μέχρι τότε δε μπορούμε να εντοπίσουμε τυχόν λάθη)

STL vector, list

STL: Standard Templates Library Προσφέρει ένα σύνολο από αφηρημένους τύπους δεδομένων, συναρτήσεις και αλγόριθμους (searching, sorting, κ.ά.) σχεδιασμένους να λειτουργούν με userspecified τύπους δεδομένων Κάθε αφηρημένος τύπος δεδομένων παρέχει υλοποιημένες χρήσιμες συναρτήσεις, συμπεριλαμβανομένων συναρτήσεων υπερφόρτωσης τελεστών Ιδέα generic programming η υλοποίηση των αλγορίθμων ή των δομών δεδομένων είναι ανεξάρτητη από τον τύπο των δεδομένων που διαχειρίζονται Παρέχει επιπλέον σημαντικά πλεονεκτήματα: Διαχείριση μνήμης (no memory leaks) Ασφάλεια (no buffer overflow)

STL: Standard Templates Library

STL iterators Ένας Iterator είναι ένα αντικείμενο που μπορεί να διαπεράσει μια container κλάση χωρίς να χρειάζεται ο χρήστης να ξέρει πώς είναι υλοποιημένη η κλάση container Για τις λίστες (και τις σχετικές κλάσεις) οι iterators είναι ο βασικός τρόπος πρόσβασης στα στοιχεία τους Ένας iterator μπορεί να θεωρηθεί σαν ένας δείκτης σε ένα στοιχείo του container, με ένα σύνολο υπερφορτωμένων τελεστών: * (Dereferencing) επιστρέφει το τρέχον στοιχείο που δείχνει ο iterator ++ Μετακινεί τον iterator στο επόμενο στοιχείο του container. Ο τελεστής -- τον μετακινεί στο προηγούμενο στοιχείο. == και!= σύγκριση για το αν δύο iterators δείχνουν στο ίδιο στοιχείο. Για να συγκρίνουμε τις τιμές στις οποίες δείχνουν θα πρέπει πρώτα να κάνουμε αποαναφοροποίηση και μετά σύγκριση. = (assignement) αναθέτουμε στον iterator μια νέα θέση (συνήθως την αρχή ή το τέλος των στοιχείων του container). Για να αναθέσουμε τιμή στο στοιχείο που δείχνει ο iterator πρέπει πρώτα να κάνουμε αποαναφοροποίηση.

STL iterators Κάθε container κλάση περιλαμβάνει 4 βασικές συναρτήσεις που χρησιμοποιούνται με τον τελεστή = begin() επιστρέφει έναν iterator που δείχνει την αρχή των στοιχείων του container. end() επιστρέφει έναν iterator που δείχνει το στοιχείο αμέσως μετά το τέλος των στοιχείων του container. cbegin() επιστρέφει έναν const (read-only) iterator που δείχνει την αρχή των στοιχείων του container. cend() επιστρέφει έναν const (read-only) iterator που δείχνει δείχνει το στοιχείο αμέσως μετά το τέλος των στοιχείων του container. Όλοι οι containers παρέχουν τουλάχιστον 2 είδη iterators: container::iterator που είναι ένας read/write iterator container::const_iterator που είναι ένας read-only iterator

Η container κλάση vector Μια από τις βασικές κλάσεις της STL Ένα vector είναι πρακτικά ένας resizable πίνακας Η κλάση μας παρέχει υλοποιημένες συναρτήσεις για random access μέσω του τελεστή [ ] Η προσθήκη ενός στοιχείου σε τυχαία θέση (και όχι μετά το τελευταίο) προκαλεί κάποιο overhead (μετακίνηση στοιχείων) Οι απαιτήσεις σε αποθηκευτικό χώρο είναι αντίστοιχες με αυτές του απλού array Κάνουμε include το header file vector (#include <vector>) Η κλάση vector ανήκει στο std namespace (using namespace std;)

H container κλάση list Είναι υλοποιημένη σαν μια διπλή συνδεδεμένη λίστα Διαφέρει από τη vector στον τρόπο υλοποίησης (εσωτερικής αναπαράστασης) Στη vector είναι δαπανηρές οι εισαγωγές στη μέση του διανύσματος αλλά είναι πολύ γρήγορη η τυχαία πρόσβαση σε οποιοδήποτε στοιχείο Η list παρέχει γρήγορες εισαγωγές στοιχείων σε οποιαδήποτε θέση αλλά αργή τυχαία πρόσβαση (γιατί οι μεταβάσεις μεταξύ στοιχείων είναι διαδοχικές). Χρησιμοποιείται με εξίσου απλό τρόπο όπως και η vector

Φτιάχνει λίστα με το στοιχείο 2 ακολουθούμενο από το στοιχείο 1 Αντιστρέφει τη σειρά των στοιχείων Ταξινομεί τα στοιχεία της λίστας 1 2 3 7 8 9