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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Πίνακες (Arrays) Εισαγωγή στη C++

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

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

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

Δισδιάστατοι Πίνακες (2D Arrays) Εισαγωγή στη C++

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

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

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

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

Εισαγωγή στον Προγραμματισμό με 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)?

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

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

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

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

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

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

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

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

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

Κλάσεις και Αντικείµενα

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

Προγραμματισμός Ι (ΗΥ120)

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

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

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

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

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

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

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

Συναρτήσεις (Functions) Εισαγωγή στη C++

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

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

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

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

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

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

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

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

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

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

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

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

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

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

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

Δομές Δεδομένων & Αλγόριθμοι

Δομές Επανάληψης. Εισαγωγή στη C++

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

Transcript:

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

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

Προβλήματα με τον τελεστή = int main() { string arr1[] = {"Γιάννης", "Ιωάννης", arr2[] = {"Μαρία", "Μάρω"; MultiPerson p1(2, arr1), p2(2, arr2); MultiPerson other = p1; // Το other δεν υπήρχε. Χρησιμο- // ποιείται ο κατ/τής αντιγραφής. other = p2; // Το other υπάρχει ήδη. Χρησιμοποιείται ( other.operator=(p2 // ο τελεστής εκχώρησης. Ισοδύναμα: // Πρόβλημα: Διαρροή μνήμης και πιθανώς λάθος εκτέλεσης. Αν δεν ορίσουμε διαφορετικά, ο τελεστής εκχώρησης αντιγράφει μία-μία τις μεταβλητές. Σε τάξεις που χρησιμοποιούν δείκτες, συνήθως απαιτείται δικός μας κατ/τής, κατ/τής αντιγράφου, καταστροφέας και δική μας υπερφόρτωση του τελεστή εκχώρησης. 3

Πριν το other = p2: other howmanynames 2 names p2 howmanynames 2 names Τι συμβαίνει; Γιάννης Ιωάννης Μαρία Μάρω Μετά το other = p2: other howmanynames 2 names p2 howmanynames 2 names διαρροή μνήμης Γιάννης Ιωάννης Μαρία Μάρω 4

Προσπάθεια υπερφόρτωσης του = void MultiPerson::operator=(const MultiPerson& right) { delete []names; // To right μπορεί να έχει howmanynames = right.howmanynames; // άλλο αριθμό ονομάτων. names = new string[howmanynames]; for(unsigned i = 0; i < howmanynames; i++) { names[i] = right.names[i]; int main() { string arr1[] = {"Γιάννης", "Ιωάννης", arr2[] = {"Μαρία", "Μάρω"; MultiPerson p1(2, arr1), p2(2, arr2); MultiPerson other = p1; // Kατ/τής αντιγράφου. (Σε μερικούς (.= // μετ/τές, όμως, καλείται ο τελεστής other = p2; // Χρήση τελεστή εκχώρησης. ΟΚ. // other = p1 = p2; // Λάθος. Ο τελεστής επιστρέφει void. // other.operator=(p1.operator=(p2)); // Ισοδύναμη μορφή. 5

Βελτιωμένη υπερφόρτωση του = MultiPerson& MultiPerson::operator=(const MultiPerson& right) { delete []names; howmanynames = right.howmanynames; names = new string[howmanynames]; for(unsigned i = 0; i < howmanynames; i++) { names[i] = right.names[i]; return *this; int main() { string arr1[] = {"Γιάννης", "Ιωάννης", arr2[] = {"Μαρία", "Μάρω"; MultiPerson p1(2, arr1), p2(2, arr2); MultiPerson other = p1; // Χρήση κατ/τή αντιγραφής. other = p2; // Χρήση τελεστή εκχώρησης. ΟΚ. other = p1 = p2; // OK. Τώρα δουλεύει. // p1 = p1; // Πρόβλημα. Καταστρέφονται τα ονόματα! 6

Τελική υπερφόρτωση του = MultiPerson& MultiPerson::operator=(const MultiPerson& right) { if(this == &right) return *this; delete []names; howmanynames = right.howmanynames; names = new string[howmanynames]; for(unsigned i = 0; i < howmanynames; i++) { names[i] = right.names[i]; return *this; Η υπερφόρτωση του = ξεκινά πάντα με έλεγχο if(this == ). Η υπερφόρτωση του = μπορεί να γίνει μόνο μέσω μεθόδου. (Δεν επιτρέπεται να χρησιμοποιηθεί ο άλλος τρόπος υπερφόρτωσης, όπου υπερφορτώνεται συνάρτηση που δεν είναι μέθοδος τάξης. ) 7

Στατικές μεταβλητές τάξεων Ι αρχείο myclass.h: #ifndef _MYCLASS_H_ #define _MYCLASS_H_ #include <iostream> #include <string> using namespace std; class MyClass { string name; static unsigned counter; // Τη μοιράζονται όλα τα αντικείμενα. public: MyClass(string nn = "") { name = nn; counter++; MyClass(const MyClass& original); ~MyClass() { counter--; unsigned getcounter() const { return counter; static unsigned getcounter2() { return counter; ; #endif 8

Στατικές μεταβλητές τάξεων ΙΙ αρχείο myclass.cpp: #include "myclass.h" unsigned MyClass::counter = 0; MyClass::MyClass(const MyClass& original) { name = original.name; counter++; 9

Στατικές μεταβλητές τάξεων IΙΙ αρχείο main.cpp: #include "myclass.h" #include <iostream> using namespace std; int main() { MyClass m1("one"), m2("two"); cout << m1.getcounter(); // ΟΚ. Μη στατική μέθοδος. cout << m2.getcounter(); // Τυπώνεται το ίδιο. cout << m1.getcounter2(); // Στατική μέθοδος. Μπορεί να // κληθεί και μέσω αντικειμένου. cout << m2.getcounter2(); // Το ίδιο αποτέλεσμα. cout << MyClass::getCounter2(); // Δε χρειάζεται αντικείμενο. // cout << MyClass::getCounter(); // Λάθος. Μη στατική μέθοδος. Οι στατικές μέθοδοι έχουν πρόσβαση μόνο σε στατικά μέλη της τάξης (π.χ. η getcounter2() δεν έχει πρόσβαση στο name). 10

Στατικές σταθερές τάξεων class Test { static const unsigned n = 2; // Επιτόπου αρχικοποίηση static const // (επιτρέπεται μόνο με ακεραίους). int arr[n]; static const string s; public: void set(unsigned i, int value) { arr[i] = value; void print() const; ; const string Test::s = "prefix "; Μερικοί μεταγλωττιστές δεν υποστηρίζουν static const μέλη. Στην ανάγκη χρησιμοποιήστε #define. void Test::print() const { for(unsigned i = 0; i < n; i++) { cout << s << arr[i] << endl; int main() { Test t; t.set(0, 1); t.set(1, 2); t.print(); 11

Μη στατικές σταθερές τάξεων class NewTest { const unsigned n; // Κάθε αντικείμενο έχει τη δική του σταθερά n. int* arr; // Κάθε αντικείμενο έχει ένα πίνακα n θέσεων, με int dummy; // πιθανώς διαφορετικό n σε κάθε αντικείμενο. public: NewTest(unsigned nn = 1);... // Χρειάζομαι και καταστροφέα, κατ/τή αντιγραφής, τελεστή =. ; NewTest::NewTest(unsigned nn) : n(nn), dummy(1) { // n = nn; // Λάθος. Οι σταθερές δεν αρχικοποιούνται έτσι. // dummy = 1; // ΟΚ, αλλά καλύτερα αρχικοποίηση με «:». arr = new int[n]; // ΟΚ, αλλά καλύτερα αρχικοποίηση με «:». int main() { NewTest t(2); t.set(0, 1); t.set(1, 2); t.print(); 12

Μη στατικές σταθερές συνέχεια NewTest::NewTest(const NewTest& original) : { n(original.n), dummy(original.dummy), arr(new int[n]) for(unsigned i = 0; i < n; i++) { arr[i] = original.arr[i]; Αναδιατάσσονται σύμφωνα με τη σειρά τους στη δήλωση της τάξης. Γίνεται: n( ), arr( ), dummy( ). Η αρχικοποίηση με «:» επιτρέπεται μόνο στους κατασκευαστές. Η αναδιάταξη συμβαίνει σε όλους τους κατασκευαστές. NewTest::~NewTest() { delete []arr; 13

Μη στατικές σταθερές συνέχεια // Μόνο οι κατασκευαστές μπορούν να αρχικοποιήσουν με ":". NewTest& NewTest::operator=(const NewTest& right) { if(this = = &right) { return *this; // Δεν μπορούμε να αλλάξουμε το n μετά τη δημιουργία του // αντικειμένου: if(n!= right.n) { cerr << "Λάθος εκχώρησης" << endl; else { dummy = right.dummy; for(unsigned i = 0; i < n; i++) { arr[i] = right.arr[i]; return *this; Συνήθως τα μηνύματα λαθών τα στέλνουμε στο cerr. 14