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

Σχετικά έγγραφα
Προγραμματισμός Υπολογιστών με C++

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Απάντηση. // 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. double convert ( double cm ) { double inch;

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

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

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

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

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

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

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

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

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

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

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

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

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

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

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

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

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

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

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

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

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

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

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

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

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

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

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

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

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

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

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

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

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

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

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

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

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

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

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

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

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

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Τι είναι κλάση Κλάση

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

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

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

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

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

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

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

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

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

18. ΡΕΥΜΑΤΑ(STREAMS) ΚΑΙ ΑΡΧΕΙΑ (FILES)

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

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

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

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

Transcript:

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

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

Υπερφόρτωση του τελεστή << class Point { float x, y; public: Point(float xx = 0, float yy = 0) { x = xx; y = yy; friend void operator<<(ostream& os, const Point& p); ; // Το ostream είναι ροή εξόδου (π.χ. cout ή αρχείο εξόδου): void operator<<(ostream& os, const Point& p) { os << p.x << ", " << p.y; // Δεν μπορώ να γράψω απλά «x», «y». Point p1(1, 2); cout << p1; // Τυπώνει «1, 2». Το cout ανήκει στην τάξη ostream. // operator<<(cout, p1); // Ισοδύναμη με την προηγούμενη γραμμή. // cout << p1 << "test"; // Δεν δουλεύει, γιατί // το cout << p1 δεν επιστρέφει τίποτα. // Ισοδύναμη μορφή: (cout << p1) << "test"; 3

Βελτιωμένη υπερφόρτωση του << class Point { float x, y; public: Point(float xx = 0, float yy = 0) { x = xx; y = yy; friend ostream& operator<<(ostream& os, const Point& p); ; ostream& operator<<(ostream& os, const Point& p) { os << p.x << ", " << p.y; return os; Point p1(1, 2); cout << p1 << endl << "test" << endl; // OK. // Ισοδύναμη μορφή: (((cout << p1) << endl) << "test") << endl; 4

Υπερφόρτωση του τελεστή << Στην περίπτωση του τελεστή << δεν συνηθίζεται ο πρώτος τρόπος υπερφόρτωσης της προηγούμενης διάλεξης (προσθήκη μεθόδου). Γιατί εκείνος ο τρόπος απαιτεί να προσθέσουμε μια μέθοδο operator<< στην τάξη ostream (στην τάξη όπου ανήκει το αριστερό όρισμα του τελεστή), αλλά δεν θέλουμε να αναμιχθούμε στον κώδικα της τάξης ostream (στις βιβλιοθήκες της C++). Ενώ με τον τρόπο που χρησιμοποιήσαμε, προσθέσαμε μια νέα μορφή της συνάρτησης operator<<, που δεν είναι μέθοδος της ostream. Τη γράφουμε συνήθως στο.cpp της νέας τάξης (Point). Το ίδιο ισχύει και για τον τελεστή >>. 5

Παράδειγμα υπερφόρτωσης του >> class MultiPerson {... // Όπως στις διαφάνειες της 8ης διάλεξης. friend istream& operator>>(istream& is, MultiPerson& p); ; // Διαβάζει τα ονόματα του p από μια ροή εισόδου (π.χ. το cin ή // αρχείο εισόδου η ifstream είναι υπο-τάξη της istream). istream& operator>>(istream& is, MultiPerson& p) { for(unsigned i = 0; i < p.howmanynames; i++) { is >> p.names[i]; return is; MultiPerson p1(2), p2(3); ifstream myfile("file.txt"); myfile >> p1 >> p2; // Δουλεύει επειδή η 1η κλήση του τελεστή >> 6 // επιστρέφει ως αποτέλεσμα τη ροή εισόδου.

Τάξεις με δείκτες το πρόβλημα class MultiPerson { unsigned howmanynames; string* names; public: MultiPerson(unsigned num, string* namesin); friend ostream& operator<<(ostream& os, const MultiPerson& p); ; MultiPerson::MultiPerson(unsigned num, string* namesin) { howmanynames = num; names = namesin; // Η αιτία του προβλήματος. string namesarr[] = {"Γιάννης", "Ιωάννης"; MultiPerson mp(2, namesarr); namesarr[1] = "Γιάννος"; // Θέλουμε να μην επηρεάζεται το mp. cout << mp; // Πρόβλημα: τυπώνει «Γιάννης», «Γιάννος». 7

Τι συμβαίνει; Τι συμβαίνει τώρα: namesin namesarr Γιάννης Ιωάννης mp howmanynames 2 names Τι θέλουμε να συμβαίνει: mp howmanynames 2 names Αλλαγές στο namesarr δεν επηρεάζουν το mp. namesin names = namesin; Αλλαγές στον namesarr επηρεάζουν και το mp. namesarr Γιάννης Ιωάννης αντίγραφο του namesarr Γιάννης Ιωάννης Γιάννος 8

Τάξεις με δείκτες η λύση class MultiPerson { unsigned howmanynames; string* names; public: MultiPerson(unsigned num, const string namesin[]); ~MultiPerson() { delete []names; friend ostream& operator<<(ostream& os, const MultiPerson& p); ; MultiPerson::MultiPerson(unsigned num, const string* namesin) { howmanynames = num; names = new string[num]; for(unsigned i = 0; i < num; i++) { names[i] = namesin[i]; string namesarr[] = {"Γιάννης", "Ιωάννης"; MultiPerson mp(2, namesarr); namesarr[1] = "Γιάννος"; cout << mp; // OK: τυπώνει «Γιάννης», «Ιωάννης». 9

Η ανάγκη για κατ/στές αντιγράφων class MultiPerson { unsigned howmanynames; string* names; public: MultiPerson(unsigned num, const string namesin[]); ~MultiPerson() { delete []names; friend ostream& operator<<(ostream& os, const MultiPerson& p); friend void test(multiperson p) { // Μεταβίβαση κατά τιμή. p.names[0] = "Γιώργος"; // Θα έπρεπε να αλλάζει μόνο // το τοπικό αντίγραφο! ; string namesarr[] = {"Γιάννης", "Ιωάννης"; MultiPerson mp(2, namesarr); test(mp); cout << mp; // Χωρίς καταστροφέα, τυπώνει «Γιώργος», «Ιωάννης»! // Με καταστροφέα, απρόβλεπτη συμπεριφορά! 10

Τι συμβαίνει; Μέσα στη main(): Κατά την κατασκευή του mp, δημιουργείται ένα αντίγραφο του NamesArr. Το mp.names δείχνει στο αντίγραφο. mp howmanynames 2 names namesarr Γιάννης Ιωάννης Γιάννης Ιωάννης Μέσα στην test(): p howmanynames 2 names Κατά την καταστροφή του p στο τέλος της test(), γίνεται delete[] ο πίνακας στον οποίο δείχνουν τα p.names και mp.names. Δημιουργείται ένα τοπικό αντίγραφο p του mp. Οι μεταβλητές του p έχουν τις ίδιες τιμές με του mp. Το p.names δείχνει εκεί που έδειχνε και το mp.names. 11

Κατασκευαστής αντιγράφου class MultiPerson {... public:... MultiPerson(const MultiPerson& original); ; MultiPerson::MultiPerson(const MultiPerson& original) { howmanynames = original.howmanynames; // Δημιουργία αντιγράφου του πίνακα: names = new string[howmanynames]; for(unsigned i = 0; i < howmanynames; i++) { names[i] = original.names[i]; 12

Χρήση κατ/τή αντιγράφου string namesarr[] = {"Γιάννης", "Ιωάννης"; MultiPerson mp(2, namesarr); test(mp); // Μεταβίβαση κατά τιμή. Χρησιμοποιείται ο // κατασκευαστής αντιγράφου. cout << mp; // ΟΚ. Τώρα τυπώνει «Γιάννης», «Ιωάννης». MultiPerson mp2(mp); MultiPerson mp3 = mp; // Χρήση κατασκ/τή αντιγράφου. // Το mp3 δεν υπήρχε. Χρησιμο- // ποιείται ο κατ/τής αντιγράφου, όχι // η μέθοδος operator= (βλ. παρακάτω). Αν δεν ορίσουμε κατ/τή αντιγράφου, δημιουργείται αυτόματα ένας, ο οποίος αντιγράφει μία-μία τις μεταβλητές των αντικειμένων. Ο κατ/τής αντιγράφου καλείται αυτόματα και όπου χρειάζεται δημιουργία αντιγράφου (π.χ. μεταβίβαση ορίσματος κατά τιμή, επιστροφή αντικειμένου κατά τιμή). 13