ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Πέρασμα παραμέτρων, συναρτήσεις δόμησης και αποδόμησης

Σχετικά έγγραφα
ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Και ομοιότητες και διαφορές με την C

ΑΝΑΚΕΦΑΛΑΙΩΣΗ. 26 Οκτωβρίου 2011

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

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

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

POINTERS, AGGREGATION, COMPOSITION

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

HY150a Φροντιστήριο 3 24/11/2017

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Copy Constructor Deep and Shallow Copies

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

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies

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

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

Συµβολοσειρές - Strings

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

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

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

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

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

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

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

Προαπαιτούμενες Ασκήσεις 5 ου Εργαστηρίου. Dose stoixeio (integer) : 25 Found stoixeio in position 7 Dose stoixeio (integer) :94 Value not found

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Copy Constructor Deep and Shallow Copies

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες Μέθοδοι tostring και equals Αντικείμενα μέσα σε αντικείμενα

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

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

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

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

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

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

C++ fundamental building blocks. (χωρίς να αναφερθούμε, όμως, σε έννοιες του αντικειμενοστρεφούς προγραμματισμού )

Προχωρημένα Θέματα ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ. Γεώργιος Παπαϊωάννου ( )

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

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

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

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

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

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

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

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

ΗΥ-150. Προγραμματισμός

Transcript:

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Πέρασμα παραμέτρων, συναρτήσεις δόμησης και αποδόμησης

ΑΝΑΚΕΦΑΛΑΙΩΣΗ

Αναφορές Όλα αυτά είναι ισοδύναμα int main() int x = 2; int &y = x; int &z = y; int main() int x = 2; int const *Ref_y = &x; int const *Ref_z = &(*Ref_y); int main() int x = 2; int &y = x; int &z = x; 0x1000 2 0x1001 0x1002 0x1000 0x1003 0x1000 x Ref_y Ref_z

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() Πως θα υλοποιήσουμε την swap? char x[100]; strcpy(x, "this"); char y[100]; strcpy(y, "that"); cout << x << " " << y << endl; // swap the strings cout << x << " " << y << endl;

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() char *x = new char[100]; strcpy(x, "this"); char *y = new char[100]; strcpy(y, "that"); cout << x << " " << y << endl; myswap(x,y); cout << x << " " << y << endl; void myswap(char *x, char *y) char z[100]; strcpy(z,y); strcpy(y,x); strcpy(x,z); Πέρασμα παραμέτρων δια αναφοράς με δείκτη

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() int x = 5; int y = 10; cout << x << " " << y << endl; myswap(x,y); cout << x << " " << y << endl; void myswap(int &x, int &y) int z = x; x = y; y = z; Πέρασμα παραμέτρων δια αναφοράς με αναφορά

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() char *x = new char[100]; strcpy(x, "this"); char *y = new char[100]; strcpy(y, "that"); cout << x << " " << y << endl; myswap(x,y); cout << x << " " << y << endl; void myswap(char *x, char *y) char *z; z = x; x = y; y = z; cout <<x << " " << y << endl; Τι έξοδο θα πάρουμε? this that that this this that Ο δείκτης περνιέται δια τιμής!

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() char *x = new char[100]; strcpy(x, "this"); char *y = new char[100]; strcpy(y, "that"); cout << x << " " << y << endl; myswap(x,y); cout << x << " " << y << endl; void myswap(char *&x, char *&y) char *z; z = x; x = y; y = z; cout <<x << " " << y << endl; Πέρασμα παραμέτρων δια αναφοράς με αναφορά

#include <iostream> #include <cstring> using namespace std; class mystring private: char s[100]; public: char *GetString(); void SetString(char const *); // Swap?? ; char * mystring::getstring() return s; void mystring::setstring(char const *snew) strcpy(s,snew); //missing checks! int main() mystring ms1, ms2; ms1.setstring("this"); ms2.setstring("that"); cout << ms1.getstring() << " " << ms2.getstring() << endl;

class mystring private: char s[100]; public: char *GetString(); void SetString(char const *); void Swap(myString &); ; void mystring::swap(mystring &other) char t[100]; char *o= other.getstring(); strcpy(t,o); other.setstring(s); strcpy(s,t); int main() mystring ms1, ms2; ms1.setstring("this"); ms2.setstring("that"); cout << ms1.getstring() << " " << ms2.getstring() << endl; ms1.swap(ms2); cout << ms1.getstring() << " " << ms2.getstring() << endl;

class mystring private: char s[100]; public: char *GetString(); void operator = (char const *); ; void mystring::operator = (char const *snew) strcpy(s,snew); int main() mystring ms1, ms2; ms1 = "this"; ms2 = "that"; cout << ms1.getstring() << " " << ms2.getstring() << endl;

#include <iostream> using namespace std; int const SIZE = 100; class Array private: int _array[size]; public: int &operator [] (int i) if (i < 0 i >= SIZE) cout << "illegal access\n"; exit(1); return _array[i]; ; Τελεστής που μπορεί να χρησιμοποιηθεί στα αριστερά μιας ανάθεσης. int main() Array A; Α[10] = 1000; int x = A[10]; cout << x;

Default τιμές στο πέρασμα παραμέτρων void f (int x = 1); void g (int a, int b = 0) cout << "a: " << a << " b: " << b << "\n"; int main () f(5); f(); g(1, 2); g(5); Τι οutput θα έχουμε? void f (int x) //could be (int x =1 ) cout << x << endl;

Default τιμές στο πέρασμα παραμέτρων void f (int x = 1); void g (int a = 0, int b) cout << "a: " << a << " b: " << b << "\n"; int main () f(5); f(); g(1, 2); g(5); Τι οutput θα έχουμε? void f (int x) //could be (int x =1 ) cout << x << endl;

Υπερφόρτωση συναρτήσεων 1 2 3 4 int divide(int a, int b) return a/b; int divide(float a, float b) return (int)(a/b); float divide(float a, float b) return a/b; float divide(int a, int b) return ((float)a)/b; Ποιοι συνδυασμοί ορισμών είναι δεκτοί? 1 4 2 3 1 2 1 3 2 4 3 4

#include <iostream> using namespace std; int const SIZE = 100; class Array private: int _array[size]; public: int &operator [] (int i) if (i < 0 i >= SIZE) cout << "illegal access\n"; exit(1); return _array[i]; ; Κάνουμε την συνάρτηση του τελεστή να επιστρέφει μια αναφορά int main() Array A; Α[10] = 1000; int x = A[10]; cout << x;

Δομές (Structs) Ο πιο απλός τρόπος δήλωσης ενός struct είναι ως εξής: struct structname ; fieldtype fieldname; fieldtype fieldname;... Στην C++ οι δομές μπορούν να έχουν και μεθόδους.

Κλάσεις και structs Κλάσεις και structs είναι σχεδόν πανομοιότυπες. Υπάρχουν λεπτές διαφορές: Π.χ., by default, οι μεταβλητές-μέλη μιας κλάσης είναι private, ενώ τα μέλη ενός struct είναι public. Προγραμματιστική πρακτική: Structs χρησιμοποιούνται για την αποθήκευση μόνο δεδομένων (όχι συναρτήσεις), και όλες οι μεταβλητές είναι public. Classes χρησιμοποιούνται για την αποθήκευση δεδομένων και ορισμό μεθόδων. Τα δεδομένα είναι private.

Αλφαριθμητικά Στην C++ τα strings είναι ξεχωριστοί τύποι δεδομένων. Ένα string είναι ένα αντικείμενο, και μπορούμε να καλέσουμε μεθόδους του αντικειμένου για να πάρουμε τα χαρακτηριστικά του string (π.χ., length) ή για να το επεξεργαστούμε. Συγκριτικά, στην C, εφαρμόζαμε συναρτήσεις πάνω στα strings αντί να καλούμε μεθόδους του string. Ο χειρισμός των strings γίνεται πολύ πιο εύκολος.

Strings Δήλωση και αρχικοποίηση #include <iostream> #include <string> using namespace std; int main() string imblank; string heymom( where is my coat? ); string heypap = whats up? ; string heygranpa(heypap); string heygranma = heymom;

Strings Επεξεργασία #include <iostream> #include <string> using namespace std; int main() string s1( I saw elvis in a UFO. ); cout << s1.size() << \endl; cout << s1.length() << \endl; cout << s1.capacity() << \endl; // >= s1.length() string s2 = thought I ; s1.insert(1, s2); // insert in position 1, i.e. right after I cout << s1.capacity() << \endl; string s3 = I ve been working too hard ; s1.append(s3); s1.append(, or am I crazy? ); cout << s1 << endl; s1.resize(10); // increase/reduce the capacity cout << s1 << \endl;

Strings Επεξεργασία με τελεστές s= s1 + s2 + s3; s += s5 + s6; s[10] = c ; s.at(10) = c ; s1 == s2 s1!= s2 s1 >= s2 alphabetic ordering s1 <= s2 s1 > s2 s1 < s2 s1.compare(0,2,s2,0,2); // compare s1[0..2] with s2[0..2] s1.swap(s2);

Strings Επεξεργασία #include <iostream> #include <string> using namespace std; int main() string s("hello mother. How are you mother? Im fine mother."); string s1( bro"); string s3( mo"); int start = 0; int found = s.find(s3, start); // find the first occurrence of string s3 in string s, starting from start. while (found!= string::npos) // if s3 not in s, the function returns string::npos (the maximum possible string length) s.replace(found, s3.length(), s1); // makes mo to bro start = found + s1.length(); cout << s << endl; found = s.find(s3, start); cout << s << endl;

ΣΥΝΑΡΤΗΣΕΙΣ ΔΟΜΗΣΗΣ (ΚΑΤΑΣΚΕΥΗΣ) CONSTRUCTORS

Class Car class Car private: int _pos; public: void InitializePosition(); void Move(); int GetPosition(); bool Collide(Car) ;

Methods void Car::InitializePosition() _pos = 0; void Car::Move() _pos += floor((double(rand())/rand_max)*3)-1; int Car::GetPosition() return _pos; bool Car::Collide(Car other) return (_pos == other.getposition());

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() Car carx; Car cary; carx.initializeposition(); cary.initializeposition(); bool collision = false; int counter = 0; while(!collision) carx.move(); cary.move(); collision = carx.collide(cary); counter ++; Τι γίνεται αν ο προγραμματιστής ξεχάσει να κάνει την αρχικοποίηση? Η μεταβλητή _pos θα πάρει τυχαία τιμή. cout << "Cars collided after " << counter <<" moves " << at position << carx.getposition() << endl;

Constructors Μια μέθοδος που ο μόνος ρόλος της ειναι να κατασκευάζει (construct) και να αρχικοποιεί το αντικείμενο. Συντακτικό: <classname>() Μπορεί να έχει ορίσματα. ΔΕΝ εχει τυπο επιστροφής ΟΥΤΕ void. Υλοποίηση: <classname>::<classname>() Η συνάρτηση καλείται αυτόματα με την δημιουργία του αντικειμένου. Είτε στη δήλωση του αντικειμένου. Είτε δημιουργία με new (θα το δούμε αργότερα).

Παράδειγμα class Car private: int _pos; public: Car(); void Move(); int GetPosition(); bool Collide(Car) ;

Παράδειγμα Car::Car() _pos = 0; Πιο σωστά: Car::Car():_pos(0) Αν είχαμε πολλές θέσεις να αρχικοποίησουμε: Car::Car():_pos1(0),_pos2(9), _pos3(4),

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() Car carx; Car cary; bool collision = false; int counter = 0; while(!collision) carx.move(); cary.move(); collision = carx.collide(cary); counter ++; Η αρχικοποίηση της θέσης γίνεται όταν ορίζουμε το αντικείμενο. cout << "Cars collided after " << counter <<" moves " << at position << carx.getposition() << endl;

Υπερφόρτωση Constructor Τι γινεται αν θελουμε να δώσουμε την αρχική θέση από την είσοδο? Υπερφόρτωση Constructor class Car private: int _pos; public: Car(); Car(int); void Move(); int GetPosition(); bool Collide(Car) ; Car::Car():_pos(0) Car::Car(int p):_pos(p)

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() Car carx; int position; cin >> position; Car cary(position); bool collision = false; int counter = 0; while(!collision) carx.move(); cary.move(); collision = carx.collide(cary); counter ++; cout << "Cars collided after " << counter <<" moves " << at position << carx.getposition() << endl;

Default Constructors Ανεξάρτητα του τι Constructors έχουμε ορίσει, μπορούμε πάντα να αρχικοποιήσουμε ένα αντικείμενο με ένα άλλο αντικείμενο. Χρησιμοποιούμε τον Default Copy Constructor Αρχικοποιεί όλα τα πεδία του αντικειμένου με τα πεδία του ορίσματος. Προσοχή αν κάποια πεδία είναι δείκτες! Υπάρχει επίσης και ο Default Constructor ο οποίος δεν έχει ορίσματα και αρχικοποιεί τα πάντα σε 0 ή null. Υπάρχει εφόσον δεν έχουμε ορίσει κάποιον άλλο constructor. Τον χρησιμοποιούσαμε εμμέσως σε όλα τα προηγούμενα παραδείγματα. Αν ορίσουμε ένα constructor παύει να υπάρχει.

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() int position; cin >> position; Car carx(position); Car carυ(carx); bool collision = false; int counter = 0; while(!collision) carx.move(); cary.move(); collision = carx.collide(cary); counter ++; cout << "Cars collided after " << counter <<" moves " << at position << carx.getposition() << endl;

Constructors Οι constructors είναι πολύ πιο σημαντικοί (και βολικοί) όταν δεσμεύουμε μνήμη μέσα στον constructor. Εξασφαλίζουμε ότι η μνήμη που χρειαζόμαστε για ένα αντικείμενο θα υπάρχει όταν το χρησιμοποιούμε. Δεν εξαρτόμαστε από το να θυμηθεί ο προγραμματιστής να καλέσει την μέθοδο αρχικοποίησης.

mystring class mystring private: char s[100]; public: char *GetString(); void SetString(char const *); void Swap(myString &); ; Τι γίνεται αν δεν θέλουμε τα strings να είναι fixed size? Το πλεονέκτημα: μπορούμε σε μια άλλη συνάρτηση να αλλάξουμε το capacity του string.

mystring class mystring private: char *s; public: char *GetString(); void SetString(char const *); void Swap(myString &); ; Κανουμε τον πίνακα s να έχει δδυναμικά δεσμευόμενη μνήμη. Το πλεονέκτημα: μπορούμε να ρυθμίσουμε δυναμικά το μέγεθος του string. Το μειονέκτημα: πρέπει να φροντίζουμε για την δέσμευση μνήμης

mystring class mystring private: char *s; public: mystring(); char *GetString(); void SetString(char const *); void Swap(myString &); ; mystring::mystring() s = new char[100]; ; Η δέσμευση της μνήμης θα γίνει μέσα στον constructor. Η συνάρτηση δόμησης εξασφαλίζει ότι δεν θα δημιουργηθεί αντικείμενο που δεν έχει την απαραίτητη μνήμη.

Destructor Ότι δεσμεύεται θα πρέπει να αποδεσμεύεται. Ο Destructor αναλαμβάνει να καταστρέψει το αντικείμενο. Αν δεν έχουμε δέσμευση μνήμης δεν είναι απαραίτητο να τον ορίσουμε, οι μεταβλητές μέλη καταστρέφονται όταν το αντικείμενο πάψει να υπάρχει. Αν έχουμε δεσμεύσει μνήμη για το αντικείμενο θα πρέπει να την αποδεσμεύσουμε.

Destructor Μια μέθοδος που ο μόνος ρόλος της είναι να αποδομεί (destruct) το αντικείμενο. O destructor κάνει ένα clean-up. Συντακτικό: ~<classname>() ΔΕΝ μπορεί να έχει ορίσματα. ΔΕΝ εχει τυπο επιστροφής ΟΥΤΕ void. Υλοποίηση: <classname>::~<classname>() Η συνάρτηση καλείται αυτόματα με την αποδόμηση του αντικειμένου. Είτε γιατί παύει να υπάρχει (βγαίνουμε από το scope που είναι ορισμένο). Είτε αποδόμηση με delete (θα το δούμε αργότερα).

mystring class mystring private: char *s; public: mystring(); ~mystring(); char *GetString(); void SetString(char const *); void Swap(myString &); ; mystring::mystring() s = new char[100]; ; Η αποδέσμευση της μνήμης θα γίνει μέσα στον destructor. Η αποδέσμευση της μνήμης είναι απαραίτητη για να αποφύγουμε memory leaks. mystring::~mystring() delete [] s; ;

Default Destructor Τον χρησιμοποιούσαμε εμμέσως μέχρι τώρα. Δεν κάνει τίποτα. Δεν αποδεσμεύει μνήμη.

Προσοχή στα μέλη που είναι δείκτες! Με τον Default Copy Constructor, τα πεδία ενός αντικειμένου αντιγράφονται στο άλλο. Αν το πεδίο είναι ένας pointer τότε οι δύο pointers θα δείχνουν στην ίδια θέση μνήμης. Αυτό μπορεί να δημιουργήσει πρόβλημα: Αν το ένα αντικείμενο καταστραφεί, ο destructor αποδεσμεύει τη μνήμη και ο pointer στο άλλο αντικείμενο δείχνει στο κενό (dangling pointer). Αυτό θα το δούμε όταν δημιουργούμε pointers σε αντικείμενα. Παρόμοιο πρόβλημα μπορεί να δημιουργηθεί αν κάνουμε τον δείκτη του αντικειμένου να δείχνει σε μια θέση που μετά καταστρέφεται.

Προσοχή στα μέλη που είναι δείκτες! mystring::mystring (char *y) s = y; // NOT A DEEP COPY mystring::~mystring () cout << s << " is deleted\n"; delete[] s; Υπερφόρτωση του Constructor με όρισμα string Υπάρχουν δυο πιθανά προβλήματα με αυτό τον κώδικα: 1. Ο χώρος μνήμης στον οποίο δείχνει το y αποδεσμεύεται και το s γίνεται dangling pointer 2. Το αντικείμενο καταστρέφεται και ο χώρος αποδεσμεύεται και η παράμετρος y γίνεται dangling pointer

Παράδειγμα με το πρόβλημα 2. main() char *x = new char[10]; strcpy(x, abcdefg ); mystring alpha(x); mystring betta(alpha); delete [] x; Κατασκευή του betta με default copy constructor betta s points to 2000 cout << alpha.getstring() << endl; // ERROR!!!!! alpha no longer exists s points to 2000 x allocated at 2000

Μία λύση mystring::mystring(char *y) cout << y << " is copied\n"; s = new char [strlen(y)+1]; strcpy(s,n); // DEEP COPY HERE mystring::mystring(mystring &x) s = new char [strlen(x.getstring())+1]; strcpy(s, x.getstring()); // DEEP COPY mystring::~mystring() cout << s << " is deleted\n"; delete[] s; Δημιουργία τοπικά χώρου και αντιγράφου του string. Το s δεν σχετίζεται πια με το χωρο μνημης του y. Υπερφόρτωση του Default Copy Constructor O destructor ελευθερώνει τον τοπικό χώρο μνήμης και η παράμετρος y δεν επηρεάζεται

Παραδειγμα betta main() char *x = new char[10]; strcpy(x, abcdefg ); mystring alpha(x); mystring betta(alpha); delete [] x; alpha s points to 3000 s points to 4000 cout << alpha.getstring() << endl; // ΟΚ!! still exists after deleting x new space allocated at 4000 x allocated at 2000 new space allocated at 3000

Παράδειγμα class intarray private: int *A; public: intarray(); ~intarray(); void cleanarray(); ; intarray::intarray() A = new int[10]; intarray::~intarray() delete [] A; void intarray::cleanarray() delete [] A; int main() intarray X; X.cleanArray(); Το πρόγραμμα αυτό προκάλει memory error, γιατι? Η κλήση της μεθόδου x.cleanarray() αποδεσμεύει τη μνήμη του πίνακα Α μέσα στο αντικείμενο Χ. Όταν το πρόγραμμα ολοκληρωθεί το αντικείμενο Χ καταστρέφεται και καλείται αυτόματα ο destructor ο οποίος προσπαθεί να σβήσει ξανά το Α προκαλώντας λάθος.