Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Ενότητα 5: Φιλικές Συναρτήσεις και Φιλικές Κλάσεις, Στατικά μέλη μιας κλάσης Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Κλάσεις Διάλεξη 5 Βαγγέλης Οικονόμου
Περιεχόμενα Σταθερά αντικείμενα και σταθερές συναρτήσεις μέλη Αντικείμενα ως μέλη κλάσεων, Φιλικές Συναρτήσεις και Κλάσεις, Στατικά μέλη κλάσεων
Σταθερά Αντικείμενα και Σταθερές Συναρτήσεις Αρχή ελαχίστων δικαιωμάτων Μερικά αντικείμενα πρέπει να τροποποιούνται, μερικά όχι Για να καθορίσουμε ότι ένα αντικείμενο δεν τροποποείται τοποθετούμε τη δεσμευμένη λέξη const κατά τη δήλωση του αντικειμένου Αν γίνει προσπάθεια να αλλάξουμε τιμή σε ένα σταθερό αντικείμενο θα καταλήξει σε λάθος μεταγλώττισης Δε μπορούμε να καλέσουμε μια συνάρτηση μέλος ενός σταθερού αντικειμένου εκτός και εάν η συνάρτηση έχει δηλωθεί ως σταθερή (const) Μια συνάρτηση const δε μπορεί να τροποποιεί τα μέλη δεδομένων μια κλάσης
Παράδειγμα int main() { Time presenttime(9,28,45); const Time noon(12,0,0); presenttime.printtime(); noon.printtime(); //σταθερό αντικείμενο //κλήση const μεθόδου //κλήση const μεθόδου presenttime.setseconds(46); presenttime.printtime(); } return 0;
Αντικείμενα ως μέλη κλάσεων Μια κλάση μπορεί να έχει ως μέλος δεδομένων μια άλλη κλάση. Η δυνατότητα αυτή ονομάζεται σύνθεση. Μια συνάρτηση δημιουργίας ενός αντικειμενου μπορεί να περάσει ορίσματα για την αρχικοποίηση των αντικειμένων μελών του αντικειμένου μας.
Παράδειγμα class Point{ public: Point(){x=0;y=0;} Point(int a, int b){x=a;y=b;} ~Point(){cout<<"Sinartisi Katastrofis"<<endl;} int getx(){return x;} int gety(){return y;} void setx(int a){x=a;} void sety(int c){y=c;} private: int x,y; }; class Rectangle{ public: Rectangle(int x1,int y1,int x2,int y2); ~Rectangle(){cout<<"Sinartisi Katastrofis"<<endl;} void printarea(); private: Point a,b; };
Φιλικές Συναρτήσεις και Κλάσεις Μια συνάρτηση friend (φιλική) μιας κλάσης ορίζεται έξω από το πεδίο δράσης της κλάσης, αλλά έχει το δικαίωμα να προσπελαύνει τα μη δημόσια μέλη της κλάσης Μπορούν να δηλωθούν ως φιλικές σε μια κλάση αυτόνομες συναρτήσεις ή ολόκληρες κλάσεις Για να δηλώσουμε μια συνάρτηση ως φιλική μιας κλάσης, βάζουμε πριν το πρότυπο της συνάρτησης στον ορισμός της κλάσης τη λέξη κλειδί friend. Για να δηλώσουμε όλες τις συναρτήσεις μέλη της κλάσης ClassTwo ως φιλικές της κλάσης ClassOne, γράφουμε μια δήλωση της μορφής friend class ClassTwo; στον ορισμό της κλάσης ClassOne.
Φιλικές Συναρτήσεις και Κλάσεις Η φιλία δωρίζεται, δεν παίρνεται: για να είναι η κλάση Β φίλος της κλάσης Α, η κλάση Α πρέπει να δηλώσει την κλάση Β ως φίλο της. Η φιλία δεν είναι ούτε μεταδοτική, ούτε συμμετρική Δηλαδή: αν Α,Β φίλοι και Β,Γ φίλοι δεν συνεπάγεται ότι και Α,Γ φίλοι Αν Α είναι φίλος της Β, δεν συνεπάγεται ότι και Β είναι φίλος της Α (συμμετρία)
Παράδειγμα Φιλική Συνάρτηση class Counter{ void increase(counter &c,int i) public: { c.x +=i; Counter(); } ~Counter(); int main() int getx(); { void setx(int a); Counter c1,c2; friend void increase(counter increase(c1,5); &c,int i); private: int x; }; } cout<<"c1:"<<c1.getx()<<endl; cout<<"c2:"<<c2.getx()<<endl; return 0;
Παράδειγμα Φιλική Κλάση class ClassTwo{ public: friend class ClassOne; ClassTwo(); ~ClassTwo(); void print(); private: int x; };
Παράδειγμα Φιλική Κλάση class ClassOne{ public: void changetwo(classtwo &a,int new_value); }; int main() void ClassOne::changeTwo(ClassTwo { &a,int new_value) ClassOne x1; { ClassTwo x2; a.x = new_value; x1.changetwo(x2,4); } x2.print(); return 0; }
Φιλικές Συναρτήσεις και Κλάσεις Όταν δηλώνουμε μια κλάση σαν φίλη μιας άλλης, παρέχουμε σε αυτή πρόσβαση στα ιδιωτικά μέλη της άλλης Όμως, γνωρίζουμε ότι όταν διευκολύνουμε την πρόσβαση στα ιδιωτικά μέλη μιας κλάσης αυξάνουμε τον κίνδυνο λαθών Με βάση το παραπάνω σκεπτικό θα θέλαμε να περιορίσουμε την πρόσβαση στην κλάση μόνο στις απαραίτητες συναρτήσεις της φίλης κλάσης
Παράδειγμα class ClassTwo; class ClassOne{ public: void changetwo(classtwo &a,int new_value); }; class ClassTwo{ public: friend void ClassOne::changeTwo(ClassTwo &c,int nv); ClassTwo(); ~ClassTwo(); void print(); private: int x; };
Στατικά Μέλη Κλάσεων Μέχρι τώρα κάθε αντικέιμενο που δημιουργούσαμε χρησιμοποιούσε ένα αποκλειστικά δικό του σύνολο μελών δεδομένων Ωστόσο, υπάρχουν περιπτώσεις όπου τα αντικείμενα μιας τάξης να κάνουν κοινή χρήση μιας μεταβλητής Για να κάνουμε ένα μέλος δεδομένων κοινόχρηστο το δηλώνουμε ως στατικό (static)
Στατικά Μέλη Κλάσεων Δημιουργία στατικού μέλους: static int κοινό μέλος; Μετά την δημιουργία ενός στατικού μέλους, το δηλώνουμε ως καθολική μεταβλητή έξω από τον ορισμό της κλάσης int όνομα κλάσης::κοινό μέλος;
Παράδειγμα class mycounter{ public: int get_count(); void set_count(int a); mycounter(); ~mycounter(); private: int count; static int countobjects; }; int mycounter::countobjects=0;
Παράδειγμα mycounter::mycounter() { count = 0; countobjects++; } mycounter::~mycounter() { countobjects--; cout<<"sinartisi Katastrofis"<<endl; cout<<"countobjects:"<<countobjects<<endl; }
Παράδειγμα int main() { mycounter c1,c2; cout<<"c2:"<<c2.get_count()<<endl; cout<<"c1:"<<c1.get_count()<<endl; c1.set_count(10); c2.set_count(12); cout<<c1.get_count()<<endl; cout<<c2.get_count()<<endl; return 0; }
Στατικά Μέλη Κλάσεων Όπως είδαμε ένα στατικό μέλος δεδομένων γίνεται κοινό για όλα τα αντικέιμενα της κλάσης Μπορεί να υπάρξουν περιπτώσεις όπου δεν έχουμε δημιουργήσει ακόμα κανένα αντικείμενο της κλάσης αλλά χρειάζεται να χρησιμοποιήσουμε το στατικό μέλος Για να γίνει αυτό θα πρέπει το στατικό μέλος να δηλωθεί ως δημόσιο
Παράδειγμα class mycounter{ public: int get_count(); void set_count(int a); mycounter(); ~mycounter(); static int countobjects; private: int count; };
Παράδειγμα int main() { cout<<"co:"<<mycounter::countobjects<<endl; mycounter::countobjects=5; cout<<"co:"<<mycounter::countobjects<<endl; return 0; } 1. Πόσα αντικέιμενα έχουμε δημιουργήσει; 2. Τι τιμή έχει η στατική μεταβλητή countobjects;
Στατικά Μέλη Κλάσεων Εκτός, από στατικά μέλη δεδομένων μπορούμε να έχουμε και στατικές μεθόδους (συναρτήσεις) Η στατική συνάρτηση μπορεί να καλείται από το πρόγραμμα μας ακόμα και αν δεν έχει δημιουργηθεί κανένα αντικέιμενο της κλάσης μας
Παράδειγμα class mycounter{ public: int get_count(); void set_count(int a); mycounter(); ~mycounter(); static void printobjects(); private: static int countobjects; int count; }; int mycounter::countobjects=0;
Παράδειγμα void mycounter::printobjects() { cout<<"number ofobjects:"<<countobjects<<endl; } int main() { mycounter::printobjects(); mycounter c1,c2; mycounter::printobjects(); return 0; }
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό. Οι όροι χρήσης των έργων τρίτων επεξηγούνται στη διαφάνεια «Επεξήγηση όρων χρήσης έργων τρίτων». Τα έργα για τα οποία έχει ζητηθεί άδεια αναφέρονται στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/από-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί.
Επεξήγηση όρων χρήσης έργων τρίτων διαθέσιμο με άδεια CC-BY διαθέσιμο με άδεια CC-BY-SA διαθέσιμο με άδεια CC-BY-ND διαθέσιμο με άδεια CC-BY-NC διαθέσιμο με άδεια CC-BY-NC-SA διαθέσιμο με άδεια CC-BY-NC-ND διαθέσιμο με άδεια CC0 Public Domain διαθέσιμο ως κοινό κτήμα χωρίς σήμανση Δεν επιτρέπεται η επαναχρησιμοποίηση του έργου, παρά μόνο εάν ζητηθεί εκ νέου άδεια από το δημιουργό. Επιτρέπεται η επαναχρησιμοποίηση του έργου και η δημιουργία παραγώγων αυτού με απλή αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού, και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η δημιουργία παραγώγων του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου και η δημιουργία παραγώγων του. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Συνήθως δεν επιτρέπεται η επαναχρησιμοποίηση του έργου.
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.