Αντικειμενοστρεφής Προγραμματισμός ΚΛΑΣΕΙΣ ΙΙ. Υπερφόρτωση (Overloading) Όταν το ίδιο όνομα συνάρτησης (μεθόδου) χρησιμοποιείται για περισσότερες από.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Από τη C στη C++ Hy240b project 2014 Phase 1.
Advertisements

Το αλφαριθμητικό (string)
Κληρονομικότητα. Εισαγωγή  Κληρονομικότητα (Inheritance) καλείται ο μηχανισμός με τον οποίο μία νέα κλάση που ονομάζεται παράγωγη (derived class) δημιουργείται.
Κεφάλαιο Τμηματικός προγραμματισμός
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++
ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΤΜΗΜΑΤΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Αντικειμενοστραφής Προγραμματισμός
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Constructors, equals, toString Αντικείμενα ως παράμετροι.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 3: Υλοποίηση μεθόδων.
 2003 Prentice Hall, Inc. All rights reserved. 1 Συναρτήσεις στη C++ ΠΕΡΙΕΧΟΜΕΝΑ Εισαγωγή Συστατικά προγράμματος στη C++ Μαθηματικές Συναρτήσεις ( Math.
Γλωσσική Τεχνολογία Object-Orientation in Python.
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων, Σημασιολογικές Ενέργειες.
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών9-1 Στατικός Έλεγχος Με τον όρο στατικός έλεγχος (static checking) χαρακτηρίζεται ο έλεγχος της συντακτικής.
Μήτρες (templates)  Μία μήτρα είναι ένα κομμάτι κώδικα που περιέχει παραμέτρους οι οποίες δέχονται ως τιμές τύπους δεδομένων.  Είναι ένας μηχανισμός.
Αντικείμενα, Κλάσεις και Μέθοδοι
ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ201:
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι)  Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και.
ΠΕΡΙΓΡΑΦΗ ΓΛΩΣΣΑΣ PYTHON
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
ΣΥΝΑΡΤΗΣΕΙΣ.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων Φροντιστήριο - 30/04/2009.
Εισαγωγή στον αντικειμενοστραφή προγραμματισμό Κλάσεις και αντικείμενα Κλάσεις και αντικείμενα Κατασκευαστές κλάσεων (constructors) Κατασκευαστές κλάσεων.
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Ι. Σαρρής, τηλ. Διάλεξη 2: Αντικείμενα.
Επικοινωνία Ανθρώπου Μηχανής HTML CGI JAVASCRIPT Κουμπούλης Χρήστος Α.Μ. 921 Χαλαβαζής Βασίλης Α.Μ. 988.
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Τμ.
Εισαγωγή στον αντικειμενοστραφή προγραμματισμό
Templates Standard Template Library (STL) Exceptions Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμήμα Εφαρμοσμένης Πληροφορικής.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 8: Πίνακας Συμβόλων Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας.
Κεφάλαιο 10 – Υποπρογράμματα
Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές.
Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Υπερφόρτωση Τελεστών (Συνέχεια) Αντικειμενοστραφής Προγραμματισμός.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
1 Κεφάλαιο 2 Εισαγωγή στον αντικειμενοστραφή προγραμματισμό.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Δομές Δεδομένων.
Μέθοδοι Μέθοδοι Δημιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΜΑΘ106/3122 – Γλώσσα Προγραμματισμού Ξ. Ζαμπούλης ΜΑΘ106/3122 Γλώσσα Προγραμματισμού Δομές Δεδομένων.
ΚΕΦΑΛΑΙΟ Το αλφάβητο της ΓΛΩΣΣΑΣ
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 2: Μεταβλητές και Τύποι Δεδομένων. Διδάσκων: Νικόλαος Θ Λιόλιος,
Ξεχωριστή Μεταγλώττιση & Χώροι Ονομάτων Αντικειμενοστραφής Προγραμματισμός.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πολυμορφισμός – Αφηρημένες κλάσεις Interfaces (διεπαφές) Ένα μεγάλο παράδειγμα.
Βασικές έννοιες προγραμματισμού Κεφάλαιο 7 ο. Βασικές έννοιες προγραμματισμού Αλφάβητο και τύποι δεδομένων Σταθερές και μεταβλητές Τελεστές, συναρτήσεις.
Εισαγωγή στη C# Μαρίνος Θεμιστοκλέους Ανδρούτσου 150 Γραφείο 206 Τηλ Ώρες Γραφείου: Τετάρτη 5-6 μμ.
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Δομές.
Templates συναρτήσεων 1/4
Κλάσεις και αντικείμενα
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Γενικές Διαδικασίες.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Γλώσσα προγραμματισμού C++
Εισαγωγή στη Java Χαρακτηριστικά της Java Εργαλεία της Java
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Ειδικά Θέματα στον προγραμματισμό Υπολογιστών
Εισαγωγή στον Προγραμματισμό με Python, ΑΠΘ ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Εισαγωγή στον Προγραμματισμό με Python Εβδομάδα 1: Βασικά στοιχεία.
Μεταγράφημα παρουσίασης:

Αντικειμενοστρεφής Προγραμματισμός ΚΛΑΣΕΙΣ ΙΙ

Υπερφόρτωση (Overloading) Όταν το ίδιο όνομα συνάρτησης (μεθόδου) χρησιμοποιείται για περισσότερες από μία συναρτήσεις (μεθόδους) τότε το όνομα θεωρείται υπερφορτωμένο. Στη C++ τα ονόματα των συναρτήσεων μπορεί να υπερφορτωθούν, δεδομένου ότι οι τύποι των παραμέτρων είναι διαφορετικοί. Για παράδειγμα μπορείτε να δηλώσετε δύο συναρτήσεις: void print(Employee e) /*……………*/ void print(Time t)/*……………*/ Όταν καλείται η συνάρτηση print(x) ο μεταγλωττιστής αποφασίσει βάσει του τύπου των ορισμάτων ποια συνάρτηση θα καλέσει. Αν και είναι καλό να χρησιμοποιούνται διαφορετικά ονόματα για τις μεθόδους μιας κλάσης, η υπερφόρτωση είναι αναγκαία στην περίπτωση πολλών κατασκευαστών. Επιπλέον στη C++ υπάρχει η δυνατότητα υπερφόρτωσης τελεστών (+, ==, <<) αρκεί ένας από τους τελεστέους να είναι αντικείμενο κάποιας κλάσης.

Σταθερά (const) αντικείμενα και μέθοδοι Principle of least priviledge -Στα αντικείμενα πρέπει να δίνονται μόνο τα δικαιώματα που χρειάζονται, και όχι περισσότερα (π.χ. ορισμένα αντικείμενα πρέπει να είναι τροποποιήσιμα και άλλα όχι) Προσδιοριστής const -Προσδιορίζει ότι ένα αντικείμενο δεν μπορεί να τροποποιηθεί - Οποιαδήποτε απόπειρα τροποποίησης είναι συντακτικό λάθος - Παράδειγμα: const Time noon( 12, 0, 0 ); Δηλώνει ένα σταθερό (const) αντικείμενο noon της κλάσης Time και το αρχικοποιεί - Οι μεταγλωττιστές της C++ δεν επιτρέπουν οποιαδήποτε κλήση σε const αντικείμενα, εκτός μέσω μεθόδων που είναι δηλωμένες const

Σταθερά (const) αντικείμενα και μέθοδοι const αντικείμενα απαιτούν const μεθόδους - Οι μέθοδοι που είναι δηλωμένες const δεν μπορούν να τροποποιήσουν το αντικείμενό τους - Ο προσδιοριστής const πρέπει να προστεθεί στη δήλωση της μεθόδου και στον ορισμό της - Πρωτότυπο: ReturnType FunctionName(param1,param2…) const; -Ορισμός: ReturnType FunctionName(param1,param2…) const { …} –Παράδειγμα: int A::getValue() const {return privateDataMember }; Επιστρέφει την τιμή ενός μέλους δεδομένων αλλά δεν τροποποιεί τίποτα και κατά συνέπεια δηλώνεται const - Οι κατασκευαστές δεν μπορούν να είναι const - Χρειάζεται να αρχικοποιούν μεταβλητές και κατά συνέπεια να τις τροποποιούν

Σύνηθες Σφάλμα Όλες οι μέθοδοι πρόσβασης θα πρέπει να δηλώνονται const class Product {... void print() const;... }; Αν δεν τηρηθεί αυτός ο κανόνας πιθανόν να δημιουργηθούν κλάσεις που δεν μπορούν να επαναχρησιμοποιηθούν. Έστω ότι η print δεν δηλώνεται const και κάποιος άλλος προγραμματιστής χρησιμοποιεί την Product: class Order { public: void print() const; private: string customer; Product article; }; void Order::print() const { cout << customer << “\n”; article.print(); //Error if Product:print not const }

Φιλικές Συναρτήσεις (Friend Functions) Φιλικές ( friend) συναρτήσεις και φιλικές κλάσεις – Μπορούν να προσπελάσουν private (και protected) μέλη μιας άλλης κλάσης –Οι friend συναρτήσεις δεν είναι μέθοδοι της κλάσης – Δηλώνονται έξω από το πεδίο εμβέλειας μιας κλάσης – Μπορούν να βελτιώσουν σε ορισμένες περιπτώσεις την ταχύτητα (π.χ. μία φιλική κλάση μπορεί να διατρέξει τα αντικείμενα μιας περικλείουσας (container) κλάσης Ιδιότητες της ‘’φιλίας’’ – Η φιλία παρέχεται, δεν αποκτάται – Μη συμμετρική (αν B είναι friend της A, η A δεν είναι κατ’ ανάγκη friend της B ) – Μή μεταβατική (αν A είναι friend της B, B είναι friend της C, A δεν είναι κατ’ ανάγκη friend της C )

Φιλικές Συναρτήσεις (Friend Functions) Δήλωση φιλικών κλάσεων/συναρτήσεων – Για να δηλωθεί μία friend συνάρτηση Εισαγωγή της δεσμευμένης λέξης friend πριν το πρωτότυπο της συνάρτησης στην κλάση που παρέχει τη φιλία friend int myFunction( int x ); –Για να δηλωθεί μία friend κλάση Εισαγωγή του friend class Classname στην κλάση που παρέχει τη φιλία αν η ClassOne παρέχει φιλία στην ClassTwo, friend class ClassTwo; θα πρέπει να εμφανίζεται στον ορισμό της ClassOne – Για πολλούς στην ΟΟ-κοινότητα, η ‘’φιλία’’ θεωρείται ότι καταστρέφει την ενσωμάτωση και την απόκρυψη πληροφορίας μειώνοντας την αξία του αντικειμενοστραφούς σχεδίου

Στατικά (static) Μέλη Κάθε αντικείμενο μιας κλάσης έχει τα δικά του αντίγραφα των μελών δεδομένων Σε ορισμένες περιπτώσεις ένα μόνο αντίγραφο πρέπει να μοιράζεται μεταξύ όλων των αντικειμένων Video Game with Martians -κάθε Martian γίνεται ‘’δειλός’’ αν οι Martians γίνουν λιγότεροι από 5 - συνεπώς, κάθε Martian πρέπει να γνωρίζει το martianCount - σπατάλη χρόνου/χώρου αν κάθε αντικείμενο Martian έχει δικό του αντίγραφο της martianCount - στην περίπτωση αυτή η martianCount είναι αποδοτικό να δηλωθεί static

Στατικά (static) Μέλη - Παρόλο που μοιάζουν με καθολικές μεταβλητές έχουν πεδίο εμβέλειας την κλάση – Αρχικοποιούνται μία μόνο φορά σε file scope (έξω από οποιαδήποτε συνάρτηση) – Υφίστανται ακόμη και αν δεν υπάρχουν αντικείμενα της κλάσης – Τόσο μεταβλητές όσο και συναρτήσεις μπορεί να είναι static –Μπορούν να είναι public, private ή protected –public static variables Μπορούν να προσπελαστούν χρησιμοποιώντας τον scope resolution operator( :: ) Employee::count –private static variables Αν δεν υπάρχει αντικείμενο της κλάσης, μπορούν να προσπελαστούν μόνο μέσω public static μεθόδου –Για την κλήση μιας public static μεθόδου συνδυάζεται το όνομα της κλάσης, ο τελεστής :: και το όνομα της μεθόδου Employee::getCount()

1 // An employee class 2 #ifndef EMPLOY1_H 3 #define EMPLOY1_H 4 #include 5using namespace std; 6class Employee { 7public: 8 Employee( string, string ); // constructor 9 ~Employee(); // destructor 10 string getFirstName() const; // return first name 11 string getLastName() const; // return last name // static member function 14 static int getCount(); // return # objects instantiated 15 16private: 17 string firstName; 18 string lastName; // static data member 21 static int count; // number of objects instantiated 22}; 23 24#endif Δήλωση static μεθόδου και μεταβλητής

25// Fig. 7.9: employ1.cpp 26// Member function definitions for class Employee 27#include 28 29using std::cout; 30using std::endl; 31 32#include 33 34#include "employ1.h" 35 36// Initialize the static data member 37int Employee::count = 0; 38 39// Define the static member function that 40// returns the number of employee objects instantiated. 41int Employee::getCount() { return count; } 42 43// Constructor dynamically allocates space for the 44// first and last name and uses strcpy to copy 45// the first and last names into the object 46Employee::Employee( string first, string last ) 47{ 48 firstName = first; lastName = last; count; // increment static count of employees 54 cout << "Employee constructor for " << firstName 55 << ' ' << lastName << " called." << endl; 56} Αρχικοποίηση static ιδιότητας count σε file scope (απαιτείται). static ιδιότητα count τροποποιείται όταν καλείται ο constructor

// Return first name of employee 72string Employee::getFirstName() const 73{ 74 return firstName; 75} // Return last name of employee 81string Employee::getLastName() const 82{ 83 return lastName; 84} 85 86

88// Fig. 7.9: fig07_09.cpp 89// Driver to test the employee class 90#include 91 92using std::cout; 93using std::endl; 94 95#include "employ1.h" 96 97int main() 98{ 99 cout << "Number of employees before instantiation is " 100 << Employee::getCount() << endl; // use class name Employee e1( "Susan", "Baker" ); 103 Employee e2( "Robert", "Jones" ); cout << "Number of employees after instantiation is " 106 << e1.getCount(); cout << "\n\nEmployee 1: " 109 << e1.getFirstName() 110 << " " << e1.getLastName() 111 << "\nEmployee 2: " 112 << e2.getFirstName() 113 << " " << e2.getLastName() << "\n\n"; 114 Αν δεν υπάρχουν αντικείμενα Employee η getCount πρέπει να προσπελαστεί με το όνομα της κλάσης και ( :: ). Number of employees before instantiation is 0 e2.getCount() ή Employee::getCount() θα δούλευε επίσης. Employee constructor for Susan Baker called. Employee constructor for Robert Jones called. Number of employees after instantiation is 2Employee 1: Susan Baker Employee 2: Robert Jones count αυξάνεται λόγω της κλήσης του constructor

return 0; 124} Number of employees before instantiation is 0 Employee constructor for Susan Baker called. Employee constructor for Robert Jones called. Number of employees after instantiation is 2 Employee 1: Susan Baker Employee 2: Robert Jones

Σύνθεση: Αντικείμενα ως μέλη δεδομένων Σύνθεση -Μία κλάση μπορεί να έχει αντικείμενα άλλων κλάσεων ως ιδιότητες Παράδειγμα class Date { public: Date(int day, int month, int year); void print() const; private: int month; int day; int year; }; class Employee { public: Employee(string name, int bDay, int bMonth, int bYear); private: string lastName; const Date birthDate; }; Employee::Employee(string name, int bDay,int bMonth, int bYear): birthDate(bDay, bMonth, bYear) { lastName = name; }