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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΣΥΝΑΡΤΗΣΕΙΣ Παραδείγματα χρήσης συναρτήσεων

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

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

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

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

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

Απάντηση. // 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)?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 5: Δείκτες και Συναρτήσεις

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

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

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

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

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

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

Εισαγωγή στις Συναρτήσεις

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

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

ΠΡΟΤΥΠΑ. ΠΑΡΑ ΕΙΓΜΑ ηµιουργία πρότυπου στοίβας (stack) και στη συνέχεια δηµιουργία µιας στοίβας σηµείων.

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

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

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

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

Διάλεξη 11η: Δείκτες, μέρος 1

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

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

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

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

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

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

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

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

Διανύσματα στις 3 Διαστάσεις

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Τελικό τεστ - απαντήσεις

ΣΧΕΔΙΟΤΥΠΑ (TEMPLATES)

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. Δείκτες (Διάλεξη 14)

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

8. ΠΙΝΑΚΕΣ (ARRAYS) (Πρόχειρο σχέδιο - Μαθήµατος 5) //26. Array.cpp #include <iostream> using namespace std;

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

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ερωτήσεις Επανάληψης

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

3 ο Εργαστήριο Μεταβλητές, Τελεστές

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Aσκήσεις Πράξης 6 - EΠΑΝΑΛΗΠΤΙΚΟ A ΜΕΘΟ ΟΛΟΓΙΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ι ΕΡΓΑΣΤΗΡΙΟ. 5. Τι τυπώνει το επόµενο πρόγραµµα:

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

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

ΣΥΝΑΡΤΗΣΕΙΣ Παραδείγματα χρήσης συναρτήσεων ΟΡΙΣΜΟΣ ΣΥΝΑΡΤΗΣΗΣ ΜΕ ΕΠΙΣΤΡΟΦΗ ΤΙΜΗΣ #include <iostream.h> int compare_numbers(int num1, int num2)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Transcript:

Προγραμματισμός Υπολογιστών με C++ ( 2012-13 ) 9η διάλεξη Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1

Τι θα ακούσετε σήμερα Μέθοδοι με ορίσματα της ίδιας τάξης. Μέθοδοι που επιστρέφουν αντικείμενα κατά τιμή ή κατά αναφορά. Υπερφόρτωση τελεστών. Φίλιες συναρτήσεις. 2

Μέθοδοι με ορίσματα ίδιας τάξης Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; void add(const Point& p) { x += p.x; y+= p.y; ; Point p1(1, 2), p2(3, 4); p1.add(p2); p1.print(); // Τυπώνει «4,6». p2.print(); // Τυπώνει «3,4». 3

Επιστροφή αντικειμένου Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; Point plus(const Point& p) const; ; Point Point::plus(const Point& p) const { Point temp(x + p.x, y + p.y); // Δημιουργία νέου τοπικού Point. return temp; // Σε μεθόδους που επιστρέφουν αντικείμενο κατά // τιμή, σκεφτόμαστε την κλήση της μεθόδου (π.χ. p1.plus(p2)) ως // αντίγραφο του αντικειμένου που καθορίζει το return. Point p1(1, 2), p2(3, 4), p3; p3 = p1.plus(p2); // Δεν αλλάζουν τα p1 και p2. p1.print(); p2.print(); p3.print(); // Τυπώνουν «1,2», «3,4», «4,6». 4

Υπερφόρτωση του τελεστή + Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; Point operator+(const Point& p) const; ; Point Point::operator+(const Point& p) const { Point temp(x + p.x, y + p.y); // Ουσιαστικά ή ίδια μέθοδος return temp; // με την plus που είχα πριν. // Ή κατευθείαν «return Point(x + p.x, y + p.y);» χωρίς temp. Point p1(1, 2), p2(3, 4); Point p3 = p1 + p2; // Χρήση υπερφορτωμένου τελεστή +. Point p4 = p1.operator+(p2); // Ισοδύναμη μορφή. p1.print(); p2.print(); // Τυπώνουν «1,2», «3,4». p3.print(); p4.print(); // Τυπώνουν «4,6», «4,6». 5

Περισσότερα για την υπερφόρτωση Μπορούν να υπερφορτωθούν μόνο υπάρχοντες τελεστές της C++ (π.χ., +, ++, >>, <<). Δεν είναι δυνατή η αλλαγή της σύνταξης των τελεστών (π.χ. ο + απαιτεί δύο ορίσματα). Η τάξη τουλάχιστον ενός από τα ορίσματα πρέπει να είναι ορισμένη από το χρήστη (π.χ. δεν επιτρέπεται να αλλάξουμε τη σημασία του + για πρόσθεση ακεραίων). 6

Υπερφόρτωση προθηματικού ++ Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; void operator++(); ; void Point::operator++() { ++x; ++y; Point p1(1, 2), p2; ++p1; // Ισοδύναμα: p1.operator++(); p1.print(); // Τυπώνει «2,3». // p2 = ++p1; // Λάθος. Η κλήση ++p1 δεν επιστρέφει τίποτα. 7

Προσπάθεια βελτίωσης Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; Point operator++(); ; Point Point::operator++() { // Αλλάζει τα x και y του αντικειμένου return Point(++x, ++y); // του οποίου τη μέθοδο καλέσαμε και // επιστρέφει αντίγραφο του αντικειμένου. Point p1(1, 2), p2, p3; p2 = ++p1; // Το ++p1 είναι ένα αντίγραφο του p1. p1.print(); p2.print(); // OK. Τυπώνει «2,3», «2,3». p3 = ++(++p1); // Το αριστερό ++ δεν εφαρμόζεται στο p1, // αλλά στο νέο Point που επιστρέφεται. p1.print(); p3.print(); // Πρόβλημα: τυπώνει «3,4», «4,5». 8

Τελική μορφή προθηματικού ++ Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; Point& operator++(); ; Point& Point::operator++() { ++x; ++y; // Ο δείκτης this δείχνει στο αντικείμενο του οποίου // καλέσαμε τη μέθοδο. *this είναι αυτό το αντικείμενο. return *this; // Την κλήση της μεθόδου (π.χ. ++p1) τη σκέφτομαι σαν // αναφορά στο αντικείμενο που καθορίζει το return, // δηλαδή σαν αναφορά στο αντικείμενο του οποίου // καλέσαμε τη μέθοδο. Point p1(1, 2), p2, p3; p2 = ++p1; p1.print(); p2.print(); // OK. Τυπώνει «2,3», «2,3». p3 = ++(++p1); // Το ++p1 είναι αναφορά στο p1. p1.print(); p3.print(); // OK. Τυπώνει «4,5», «4,5». 9

Υπερφόρτωση επιθηματικού ++ Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << "," << y << endl; Point operator++(int); // Το όρισμα δεν χρησιμοποιείται. Απλά ; // χρησιμοποιείται ως ένδειξη ότι πρόκειται // για την επιθηματική μορφή του ++. Point Point::operator++(int) { Point temp(x, y); // Επιστρέφουμε αντίγραφο του αντικειμένου, x++; y++; // όπως ήταν πριν την αύξηση. return temp; Point p1(1, 2), p2; p2 = p1++; // Ισοδύναμα: p1.operator++(1); p1.print(); p2.print(); // Τυπώνει «2,3» και «1,2». 10

Ανεπιθύμητη χρήση επιθηματικού ++ Point Point::operator++(int) { Point temp(x, y); x++; y++; return temp; Point p1(1, 2), p2; p2 = (p1++)++; // Το δεξιό ++ αυξάνει το αντικείμενο // Point που επιστρέφει η κλήση p1++ // (αντίγραφο του p1 πριν την αύξηση) και // επιστρέφει αντίγραφο αυτού του // αντικειμένου πριν τη δεύτερη αύξηση. // Μάλλον άχρηστο... p1.print(); p2.print(); // Τυπώνει «2,3» και «1,2». int i = 10, j = (i++)++; // Δεν επιτρέπεται. Θα θέλαμε να μην // επιτρέπεται ούτε το (p1++)++. 11

Βελτιωμένη μορφή επιθηματικού ++ const Point Point::operator++(int) { Point temp(x, y); x++; y++; return temp; Point p1(1, 2), p2; // p2 = (p1++)++; // Τώρα δεν επιτρέπεται, γιατί το p2 = p1++; // αντικείμενο Point (αντίγραφο) που // επιστρέφει η κλήση p1++ είναι const. // Επιτρέπεται. p1.print(); p2.print(); // Τυπώνει «2,3» και «1,2». 12

Εναλλακτικός τρόπος υπερφόρτωσης Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << ", " << y << endl; float getx() const {return x; float gety() const {return y; ; // H operator+ τώρα δεν είναι μέθοδος της Point: Point operator+(const Point& q, const Point& p) { return Point(q.getX() + p.getx(), q.gety() + p.gety()); Point p1(1, 2), p2(3, 4); Point p3 = p1 + p2;. // Ισοδύναμο: Point p3 = operator+(p1, p2); p1.print(); p2.print(); p3.print(); // «1,2», «3,4», «4,6». 13

Ή με ορισμό φίλιας συνάρτησης Point(float xx = 0, float yy = 0) { x = xx; y = yy; void print() const { cout << x << ", " << y << endl; friend Point operator+(const Point& q, const Point& p); ; // H operator+ δεν είναι μέθοδος της Point, αλλά η δήλωση // friend τής δίνει πρόσβαση στα ιδιωτικά μέλη της Point: Point operator+(const Point& q, const Point& p) { return Point(q.x + p.x, q.y + p.y); Point p1(1, 2), p2(3, 4); Point p3 = p1 + p2;. // Ισοδύναμο: Point p3 = operator+(p1, p2); p1.print(); p2.print(); p3.print(); // «1,2», «3,4», «4,6». 14