int main int x 2 int y x

  • Slides: 49
Download presentation

Αναφορές int main() { int x = 2; int &y = x; int &z

Αναφορές int main() { int x = 2; int &y = x; int &z = y; } int main() { int x = 2; int &y = x; int &z = x; } Όλα αυτά είναι ισοδύναμα int main() { int x = 2; int const *Ref_y = &x; int const *Ref_z = &(*Ref_y); } 0 x 1000 2 0 x 1001 … 0 x 1002 0 x 1000 Ref_y 0 x 1003 0 x 1000 Ref_z x

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() Πως θα {

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

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() { char *x

Πέρασμα παραμέτρων #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; my. Swap(x, y); cout << x << " " << y << endl; } void my. Swap(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

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

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() { char *x

Πέρασμα παραμέτρων #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; my. Swap(x, y); cout << x << " " << y << endl; } void my. Swap(char *x, char *y) { char *z; z = x; x = y; y = z; cout <<x << " " << y << endl; } Τι έξοδο θα πάρουμε? this that Ο δείκτης περνιέται δια τιμής!

Πέρασμα παραμέτρων #include <iostream> #include <cstring> using namespace std; int main() { char *x

Πέρασμα παραμέτρων #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; my. Swap(x, y); cout << x << " " << y << endl; } void my. Swap(char *&x, char *&y) { char *z; z = x; x = y; y = z; cout <<x << " " << y << endl; } Πέρασμα παραμέτρων δια αναφοράς με αναφορά

#include <iostream> #include <cstring> using namespace std; class my. String { private: char s[100];

#include <iostream> #include <cstring> using namespace std; class my. String { private: char s[100]; public: char *Get. String(); void Set. String(char const *); // Swap ? ? }; char * my. String: : Get. String() { return s; } void my. String: : Set. String(char const *s. New) { strcpy(s, s. New); //missing checks! } int main(){ my. String m. S 1, m. S 2; m. S 1. Set. String("this"); m. S 2. Set. String("that"); cout << m. S 1. Get. String() << " " << m. S 2. Get. String() << endl; }

class my. String { private: char s[100]; public: char *Get. String(); void Set. String(char

class my. String { private: char s[100]; public: char *Get. String(); void Set. String(char const *); void Swap(my. String &); }; void my. String: : Swap(my. String &other) { char t[100]; char *o= other. Get. String(); strcpy(t, o); other. Set. String(s); strcpy(s, t); } int main(){ my. String m. S 1, m. S 2; m. S 1. Set. String("this"); m. S 2. Set. String("that"); cout << m. S 1. Get. String() << " " << m. S 2. Get. String() << endl; m. S 1. Swap(m. S 2); cout << m. S 1. Get. String() << " " << m. S 2. Get. String() << endl; }

class my. String { private: char s[100]; public: char *Get. String(); void operator =

class my. String { private: char s[100]; public: char *Get. String(); void operator = (char const *); }; void my. String: : operator = (char const *s. New) { strcpy(s, s. New); } int main(){ my. String m. S 1, m. S 2; m. S 1 = "this"; m. S 2 = "that"; cout << m. S 1. Get. String() << " " << m. S 2. Get. String() << endl; }

#include <iostream> using namespace std; int const SIZE = 100; Τελεστής που μπορεί να

#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 accessn"; exit(1); } return _array[i]; } }; int main(){ Array A; Α[10] = 1000; int x = A[10]; cout << x; }

Υπερφόρτωση συναρτήσεων 1 2 3 4 int divide(int a, int b){ return a/b; }

Υπερφόρτωση συναρτήσεων 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; Κάνουμε την συνάρτηση του

#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 accessn"; exit(1); } return _array[i]; } }; int main(){ Array A; Α[10] = 1000; int x = A[10]; cout << x; }

Strings – Δήλωση και αρχικοποίηση #include <iostream> #include <string> using namespace std; int main(){

Strings – Δήλωση και αρχικοποίηση #include <iostream> #include <string> using namespace std; int main(){ string im. Blank; string hey. Mom(“where is my coat? ”); string hey. Pap = “whats up? ”; string hey. Gran. Pa(hey. Pap); string hey. Gran. Ma = hey. Mom; }

Strings – Επεξεργασία #include <iostream> #include <string> using namespace std; int main(){ string s

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

Strings – Επεξεργασία με τελεστές s= s 1 + s 2 + s 3;

Strings – Επεξεργασία με τελεστές s= s 1 + s 2 + s 3; s += s 5 + s 6; s[10] = ‘c’; s. at(10) = ‘c’; s 1 == s 2 s 1 != s 2 s 1 >= s 2 alphabetic ordering s 1 <= s 2 s 1 > s 2 s 1 < s 2 s 1. compare(0, 2, s 2, 0, 2); // compare s 1[0. . 2] with s 2[0. . 2] s 1. swap(s 2);

Strings – Επεξεργασία #include <iostream> #include <string> using namespace std; int main(){ string s("Hello

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

Class Car class Car { private: int _pos; public: void Initialize. Position(); void Move();

Class Car class Car { private: int _pos; public: void Initialize. Position(); void Move(); int Get. Position(); bool Collide(Car) };

Methods void Car: : Initialize. Position() { _pos = 0; } void Car: :

Methods void Car: : Initialize. Position() { _pos = 0; } void Car: : Move() { _pos += floor((double(rand())/RAND_MAX)*3)-1; } int Car: : Get. Position() { return _pos; } bool Car: : Collide(Car other) { return (_pos == other. Get. Position()); }

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() { Car car. X; Car car. Y; car. X. Initialize. Position(); car. Y. Initialize. Position(); bool collision = false; int counter = 0; while(!collision){ car. X. Move(); car. Y. Move(); collision = car. X. Collide(car. Y); counter ++; } Τι γίνεται αν ο προγραμματιστής ξεχάσει να κάνει την αρχικοποίηση? Η μεταβλητή _pos θα πάρει τυχαία τιμή. cout << "Cars collided after " << counter <<" moves " << “at position “ << car. X. Get. Position() << endl; }

Παράδειγμα class Car { private: int _pos; public: Car(); void Move(); int Get. Position();

Παράδειγμα class Car { private: int _pos; public: Car(); void Move(); int Get. Position(); bool Collide(Car) };

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int

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

Υπερφόρτωση Constructor • Τι γινεται αν θελουμε να δώσουμε την αρχική θέση από την

Υπερφόρτωση Constructor • Τι γινεται αν θελουμε να δώσουμε την αρχική θέση από την είσοδο? • Υπερφόρτωση Constructor class Car { private: int _pos; public: Car(); Car(int); void Move(); int Get. Position(); 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

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() { Car car. X; int position; cin >> position; Car car. Y(position); bool collision = false; int counter = 0; while(!collision){ car. X. Move(); car. Y. Move(); collision = car. X. Collide(car. Y); counter ++; } cout << "Cars collided after " << counter <<" moves " << “at position “ << car. X. Get. Position() << endl; }

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int

#include <iostream> #include <cmath> #include <cstdlib> /* Car class definition, method definitions */ int main() { int position; cin >> position; Car car. X(position); Car carΥ(car. X); bool collision = false; int counter = 0; while(!collision){ car. X. Move(); car. Y. Move(); collision = car. X. Collide(car. Y); counter ++; } cout << "Cars collided after " << counter <<" moves " << “at position “ << car. X. Get. Position() << endl; }

my. String class my. String { private: char s[100]; public: char *Get. String(); void

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

my. String class my. String { private: char *s; public: my. String(); ~my. String();

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

Παράδειγμα με το πρόβλημα 2. main(){ char *x = new char[10]; strcpy(x, “abcdefg”); Κατασκευή

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

Μία λύση Δημιουργία τοπικά χώρου και αντιγράφου του string. Το s δεν σχετίζεται πια

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

Παραδειγμα betta s points to 4000 main(){ char *x = new char[10]; strcpy(x, “abcdefg”);

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