You are on page 1of 229

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢(Θ)

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢


΢ΧΟΛΗ ΣΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ
ΣΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ενότητα 1

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

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Περιεχόμενα ενότητασ
1. Ιζηνξηθό ησλ γισζζώλ C θαη C++ 23. Κιήζε θαη’ αμία (call by value),
2. C++ Πξόηππε βηβιηνζήθε ζπλάξηεζε ρσξίο επηζηξνθή ηηκήο
3. Java 24. Παξάδεηγκα κε ηνπηθέο κεηαβιεηέο
4. Λόγνη εθκάζεζεο C++ 25. Παξάδεηγκα κε θαζνιηθέο κεηαβιεηέο
5. C++ vs Java 26. Δκβέιεηα κεηαβιεηώλ (scope)
6. Γνκεκέλνο Πξνγξακκαηηζκόο 27. Δκβέιεηα κεηαβιεηώλ (ζπλέρεηα)
7. Τη είλαη ν αληηθεηκελνζηξαθήο πξνγξακκαηηζκόο; 28. Αλαδξνκηθόηεηα (recursion)
8. Τππηθό πεξηβάιινλ αλάπηπμεο ηεο C++ 29. Γήισζε δείθηε
9. Οξνινγία 30. Αξρηθνπνίεζε δεηθηώλ
10. Η Γιώζζα C++ 31. Δθαξκνγή δεηθηώλ
11. Έμνδνο δεδνκέλσλ 32. Γείθηεο θαη ζπλαξηήζεηο
12. Δίζνδνο δεδνκέλσλ 33. (Υπελζύκηζε) Σπλάξηεζε θαη Πίλαθεο
13. Φεηξηζηέο 34. Κιήζε θαη’ αλαθνξά
14. Πξνζαξκνγέο ηύπσλ (casting) 35. Σπλαξηήζεηο θαη Γείθηεο
15. Τειεζηέο 36. Σπλαξηήζεηο κε ηύπν επηζηξνθήο δείθηε
16. Βξόρνη θαη απνθάζεηο 37. Παξάδεηγκα static
17. Γνκέο επηινγήο
18. Γνκέο επαλάιεςεο
19. Σπλαξηήζεηο
20. Oξηζκόο ζπλάξηεζεο
21. Kιήζε ζπλάξηεζεο
22. Κιήζε θαη’ αμία (call by value),
ζπλάξηεζε κε επηζηξνθή ηηκήο
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ιρςξοικό ςχμ γλχρρώμ C και C++


Ιρςξοικό ςηπ C
Δνέλινη ςχμ γλχρρώμ BCPL και B
Dennis Ritchie (Δογαρςήοια Βell)
Γλώρρα αμάπςσνηπ ςξσ Λ.΢. UNIX
Αμενάοςηςη ςξσ λειςξσο-γικξύ ρςξ
ξπξίξ εκςελξύ-μςαι ςα ποξγοάμμαςά
ςηπ
Υξοηςά ποξγοάμμαςα
1989: Ποόςσπξ ANSI
1990: Ποόςσπα ANSI και ISO
ANSI/ISO 9899: 1990
Tελεσςαία ποόςσπα ISO:
C1999 και C2011

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ιρςξοικό ςχμ γλχρρώμ C και C++
Ιρςξοικό ςηπ C++
 Δπέκςαρη ςηπ C
 1983: Bjarne Stroustrup (Δογαρςήοια Bell)
 “Πεοιπξιημέμη” C
 Παοέυει ςη δσμαςόςηςεπ αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ
Αμςικείμεμα: επαμαυοηριμξπξιήριμα ρσρςαςικά λξγιρμικξύ
Αμςικειμεμξρςοατή ποξγοάμμαςα
Δύκξλα ρςημ καςαμόηρη, διόοθχρη και ςοξπξπξίηρη
 Τβοιδική γλώρρα
Πεοιέυει ρςξιυεία και τξομαλιρμό από ςη C
Έυει ςημ ςευμξςοξπία ςξσ αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ιρςξοικό ςχμ γλχρρώμ C και C++

•Η C++ ποξέουεςαι από ςη γλώρρα C. Για ςημ ακοίβεια είμαι έμα


σπεορύμξλξ ςηπ C. Κάθε ρχρςή ποόςαρη ςηπ C, είμαι και ποόςαρη
ςηπ C++. Σα επιπλέξμ ρςξιυεία πξσ ποξρςέθηκαμ ρςημ C για μα
ποξκύφει η C++, είμαι ξι κλάρειπ και ςα αμςικείμεμα και γεμικά ξ
αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ. Δπιποόρθεςα, η C++ έυει
πξλλά μέα υαοακςηοιρςικά πξσ πεοιλαμβάμξσμ, κσοίχπ, μία
βελςιχμέμη ποξρέγγιρη ςηπ ειρόδξσ/ενόδξσ δεδξμέμχμ.

•Ποόςσπα C++:
ANSI/ISO: 1998
ISO: 2011

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


C++ Ποόςσπη βιβλιξθήκη

Ο αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ παοιρςάμει έμα ρύρςημα χπ


μία ρσλλξγή από αμςικείμεμα ςα ξπξία αλληλεπιδοξύμ και αλλάζξσμ
με ςξ υοόμξ.

Έμα αμςικειμεμξρςοατέπ ποόγοαμμα απξςελείςαι από κλάρειπ και


αμςικείμεμα.

Σα αμςικείμεμα έυξσμ ιδιόςηςεπ (υαοακςηοιρςικά) και εμέογειεπ


(ρσμπεοιτξοά) πξσ ρσμδέξμςαι μ‟ασςά.

Η ποόςσπη βιβλιξθήκη πεοιέυει μία εσούςαςη ρσλλξγή από κλάρειπ


και ρσμαοςήρειπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Java

 1991: Sun Microsystems


«Ποάριμξ ποόγοαμμα» - Green project (Patrick Naughton, James Gosling, Mike Sheridan).
Σηόσορ ο ππογπαμμαηιζμόρ μικποζςζκεςών, σωπίρ ηην πολςπλοκόηηηα ηηρ C++.

 1995: Sun Microsystems


Eπίρημη ξμξμαςξδξρία ςηπ μέαπ γλώρραπ χπ Java

 Ιρςξρελίδεπ με δσμαμικό και διαδοαρςικό πεοιευόμεμξ

 Αμάπςσνη εταομξγώμ μεγάληπ κλίμακαπ

 Διεσοσμέμη λειςξσογικόςηςα web servers

 Δταομξγέπ για καςαμαλχςικέπ ρσρκεσέπ


Κιμηςά ςηλέτχμα, βξμβηςέπ, PDA, κ.λ.π.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Λόγνη εθκάζεζεο C++

•Γλώρρα αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ σφηλξύ επιπέδξσ, με ρςξιυεία από


διαδικαρςικέπ γλώρρεπ (C, Pascal κ.λ.π.)
•Απαιςξύμεμξ ποξρόμ για πξλλέπ θέρειπ εογαρίαπ.
•Παοέυεςαι πλήοηπ έλεγυξπ ρςξμ ποξγοαμμαςιρςή:
 Τπξκαθιρςά ρε πξλλέπ πεοιπςώρειπ ςη υοήρη γλώρραπ μηυαμήπ (όπχπ και η
γλώρρα C).
 Δπιςσγυάμεςαι ακοιβήπ έλεγυξπ παμςξύ, κσοίχπ δε ρςη διαυείοιρη ςηπ μμήμηπ.
•Τφηλή ςαυύςηςα εκςέλερηπ.
•Μειξμεκςήμαςα:
 Πεοίπλξκη γλώρρα
 Απαιςεί ποξρξυή και ρυξλαρςικόςηςα ρςη ρσγγοατή κώδικα, καθώπ και ιδιαίςεοη
ενάρκηρη

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

C++ vs Java

•΢ςξ ποόγοαμμα ρπξσδώμ ποξβλέπεςαι και η εκμάθηρη ςηπ Java (ρςξ μάθημα
Μεθξδξλξγία Ποξγοαμμαςιρμξύ ςξσ 6ξσ εναμήμξσ).

•Η κάθε γλώρρα ποξξοίζεςαι για άλλεπ εταομξγέπ και διατξοεςικέπ απαιςήρειπ. Παοόλξ
πξσ η Java μξιάζει με ςη C++, ποόκειςαι για διατξοεςικέπ γλώρρεπ. Π.υ:
 Η C++ επιςοέπει ρσμαοςήρειπ πξσ δεμ είμαι μέθξδξι ςάνεχμ.

 Η C++ επιςοέπει ςη υοήρη δεικςώμ και δεμ παοέυει ασςόμαςη απξκξμιδή


απξοοιμμάςχμ (garbage collection). Βέβαια ςξ ποόςσπξ C++11 καθξοίζει
μηυαμιρμξύπ απξκξμιδήπ απξοοιμάςχμ, αλλά η σπξρςήοινή ςξσπ από ςξσπ
μεςαγλχςςιρςέπ είμαι ποξαιοεςική.

 Ο κάθε μεςαγλχςςιρςήπ ςηπ C++ παοάγει εκςελέριμξ κώδικα για ρσγκεκοιμέμξ


επενεογαρςή.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


C++ vs Java
΢ε πξλλέπ εταομξγέπ πξσ απαιςείςαι ςαυύςηςα και μεγάλη ποξβλεφιμόςηςα απόδξρηπ ή έλεγυξπ, η
Java δε μπξοεί μα αμςαπενέλθει:

•Ποξγοαμμαςιρμόπ ρε επίπεδξ λειςξσογικξύ ρσρςήμαςξπ

• Δπιρςημξμικξί σπξλξγιρμξί

• Μαζικά δεδξμέμα (π.υ. ρσρςήμαςα διαυείοιρηπ δεδξμέμχμ)

•Αλληλεπιδοαρςικά ρσρςήμαςα (π.υ. γοατικά Η/Τ, GUIs)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

C++ vs Java
Ποξςιμάςαι η C++ όςαμ η ςαυύςηςα ςξσ ποξγοάμμαςξπ είμαι
κοίριμξπ παοάγξμςαπ:
 Παοάγεςαι κώδικαπ μηυαμήπ από ςημ αουή, όυι byte code και Just
in-time (JIT) παοαγχγή κώδικα
 Ολική βελςιρςξπξίηρη ςξσ κώδικα από ςξμ compiler, κάςι πξσ δεμ
μπξοεί μα γίμει ρςη Java.
 Δε μερξλαβεί κάπξια Virtual Machine (π.υ. JVM) πξσ ρπαςαλά
πόοξσπ για ςη δική ςηπ λειςξσογία.
 Μπξοξύμ μα υοηριμξπξιηθξύμ βελςιρςξπξιημέμεπ σλξπξιήρειπ και
ειδικά CPU Instruction Sets (π.υ. SSE4).
 Ο ποξγοαμμαςιρςήπ μπξοεί μα παοέμβει ρε πξλύ υαμηλό επίπεδξ
ρςη βελςιρςξπξίηρη ςηπ απόδξρηπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


C++ vs Java
Ποξςιμάςαι η C++ όςαμ η καςαμάλχρη μμήμηπ ςξσ ποξγοάμμαςξπ είμαι κοίριμξπ παοάγξμςαπ:

 Δεμ παοέυεςαι άσςόμαςη απξκξμιδή απξοοιμάςχμ. Ο ποξγοαμμαςιρςήπ απξταρίζει πώπ και


πόςε θα απξδερμεύρει μμήμη.

 Γίμεςαι ακοιβήπ έλεγυξπ ςχμ δεδξμέμχμ πξσ απξθηκεύξμςαι.

 Παοάγεςαι ιδιαίςεοα ρσμπαγήπ κώδικαπ.

 Μπξοξύμ μα σλξπξιηθξύμ δικξί μαπ μηυαμιρμξί διαυείοιρηπ μμήμηπ (caches, memory pooling,
lazy allocators).
Δπίρηπ ποξςιμάςαι η C++ όςαμ απαιςείςαι υαμηλή καςαμάλχρη εμέογειαπ:

 Δε μερξλαβεί Virtual Machine. Η VM είμαι και η ίδια έμα εκςελέριμξ ποόγοαμμα, ξπόςε όςαμ
εκςελείςαι ξ κώδικά, υοηριμξπξιξύμςαι παοάλληλα επιποόρθεςξι πόοξι ςξσ ρσρςήμαςξπ
(κσοίχπ κύκλξσπ CPU) πξσ καςαμαλώμξσμ εμέογεια.

 Δίμαι ρημαμςικόπ παοάγξμςαπ ρε αουιςεκςξμικέπ κιμηςώμ ρσρκεσώμ (κιμηςά ςηλάτχμα,


tablets, εμρχμαςχμέμα ρσρςήμαςα κ.λ.π.).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δνκεκέλνο Πξνγξακκαηηζκόο

Δομημένορ Ππογπαμμαηιζμόρ (δεκαεηία ηος 1960)


Σςζηημαηική πποζέγγιζη ζηη ζςγγπαθή ππογπαμμάηων
Ππογπάμμαηα εύκολα ζηην καηανόηζη, ηον έλεγσο, ηην
αποζθαλμάηωζη και ηην ηποποποίηζη
Pascal
1971: Niklaus Wirth
Ada
Δεκαεηία ηος 1970s – απσέρ ηηρ δεκαεηίαρ ηος 1980s: ΥΠ.ΕΘ.Α. Η.Π.Α.
(Department of Defense - DoD)
Πολςεπεξεπγαζία (Multitasking):
Καθοπιζμόρ πολλαπλών δπαζηηπιοηήηων πος εκηελούνηαι
παπάλληλα

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σι είμαι ξ αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ;
•Οι διαδικαρςικέπ γλώρρεπ δίμξσμ έμταρη ρςιπ εμέογειεπ πξσ ποέπει μα εκςελέρει έμα
ποόγοαμμα.

•Ο αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ αμαλύει πξλύπλξκα ρσρςήμαςα ενεςάζξμςαπ ςα


υαοακςηοιρςικά ςχμ ρςξιυείχμ ςξσπ και ςξμ ςοόπξ πξσ ασςά αλληλεπιδοξύμ.

Ο αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ γεμμήθηκε και άουιρε μα αμαπςύρρεςαι όςαμ


πλέξμ ήςαμ ταμεοό όςι:

•Οι παοαδξριακέπ ποξρεγγίρειπ ρςξμ ποξγοαμμαςιρμό δεμ μπξοξύραμ μα αμςαπξκοιθξύμ


ρςιπ μέεπ απαιςήρειπ αμάπςσνηπ ποξγοαμμάςχμ.

•Καθώπ ςα ποξγοάμμαςα μεγάλχμαμ, γίμξμςαμ σπεοβξλικά πξλύπλξκα και η υοήρη


διαδικαρςικώμ γλχρρώμ ποξγοαμμαςιρμξύ (PASCAL, C, κλπ.) παοξσρίαζε αδσμαμίεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Γιαςί είμαι διατξοεςικόπ;

Ο ποξγοαμμαςιρμόπ παοαδξριακά ήςαμ ποξραμαςξλιρμέμξπ ρςξ


έογξ πξσ θα έποεπε μα παοαυθεί.

Έμα έογξ διαιοείςξ ρε σπξέογα και ασςά διαιοξύμςαμ ρε


μικοόςεοα σπξέογα, έχπ όςξσ ξι ξοιρμξί ςξσπ μα είμαι ςόρξ
απλξί ώρςε μα μπξοξύμ μα μεςαςοαπξύμ ρε κώδικα.

Η αμςικειμεμξρςοατήπ αμάλσρη είμαι πξλύ πιξ κξμςά ρςξ πώπ


εμείπ βλέπξσμε ςξμ κόρμξ γύοχ μαπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσπικό πεοιβάλλξμ αμάπςσνηπ ςηπ C++
Σπληάθηε
Τν πξόγξακκα ζπληάζζεηαη
Γίζθνο
Σηάδηα ηωλ πξνγξακκάηωλ ο ζην ζπληάθηε
απνζεθεύεηαη ζην δίζθν.
θαη

Πξνεπεμεξγαζηήο O πξνεπεμεξγαζηήο επεμεξ-


C++: Γίζθνο
γάδεηαη ηνλ θώδηθα.
Ο κεηαγιωηηηζηήο
1. Σύληαμε Μεηαγισηηηζηήο Γίζθνο δεκηνπξγεί ηνλ αληηθείκελν
θώδηθα θαη ηνλ απνζεθεύεη
Ο
ζηνζπλδέηεο
δίζθν. δηαζπλδεεη ηνλ
2. Πξνεπεμεξγαζία Σπλδέηεο Γίζθνο

Κύξηα
αληηθείκελν θώδηθα κε ηηο
βηβιηνζήθεο, δεκηνπξγεί ην
Mλήκε εθηειέζηκν αξρείν θαη ην
3. Μεηαγιώηηηζε Φνξησηήο απνζεθεύεη ζην δίζθν.

Ο θνξηωηήο θνξηώλεη ην
4. Σύλδεζε Γίζθνο ..
..
πξόγξακκα ζηε κλήκε.

..

5. Φόξηωζε Κύξηα
Mλήκε
CPU
Η CPU παίξλεη θάζε νδεγία
6. Εθηέιεζε θαη ηελ εθηειεί,
απνζεθεύνληαο πηζαλώο λέεο
.. ηηκέο δεδνκέλωλ θαηά ηελ
..
.. εθηέιεζε ηνπ πξνγξάκκαηνο.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Οοξλξγία

Κλάρη (Class)
Μία κλάρη είμαι μία ρσλλξγή από αμςικείμεμα, πξσ
μξιοάζξμςαι ςα ίδια υαοακςηοιρςικά και επιδοξύμ με ςξ
ρύρςημα με ςξμ ίδιξ ςοόπξ. Σα υαοακςηοιρςικά και η
επίδοαρη ξοίζξμςαι για ςιπ κλάρειπ.

Αμςικείμεμξ (Object)
Έμα αμςικείμεμξ είμαι έμα μέλξπ μίαπ κλάρηπ. Αμ και ξ
ξοιρμόπ γίμεςαι ρε επίπεδξ κλάρηπ, η ποαγμαςική
επίδοαρη ρσμβαίμει με αμενάοςηςα αμςικείμεμα.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Οοξλξγία (ρσμέυεια)

΢σμαοςήρειπ (Functions)
΢ςξμ ποξγοαμαςιρμό ξ κώδικαπ για μία ρσγκεκοιμέμη εμέογεια
ξμξμάζεςαι ρσμάοςηρη.
΢ςξμ αμςικειμεμξρςοατή ποξγοαμμαςιρμό ςημ αλληλεπίδοαρη
μεςανύ αμςικειμέμχμ ή αμςικειμέμχμ και ςξσ ένχ κόρμξσ, ςημ
υειοίζξμςαι ξι ρσμαοςήρειπ. Ασςό ξμξμάζεςαι ρσμπεοιτξοά.
Μία αμςικειμεμξρςοατήπ ρσμάοςηρη είμαι παοόμξια με μία
ρσμηθιρμέμη ρσμάοςηρη αλλά γεμικά ξι αμςικειμεμξρςοατείπ
ρσμαοςήρειπ ςείμξσμ μα είμαι μικοόςεοεπ και απλξύρςεοεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Οοξλξγία (ρσμέυεια)

Δμθσλάκχρη (Encapsulation)
• Ασςή ξοίζει ςξ βαθμό ποξρπελαριμόςηςαπ πξσ μία κλάρη
επιςοέπει ρε άλλεπ κλάρειπ. Δίμει ςη δσμαςόςηςα ρςιπ γλώρρεπ
αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ μα ξμαδξπξιξύμ και μα
απξκούπςξσμ δεδξμέμα και διαδικαρίεπ ςχμ αμςικειμέμχμ.
• Κάπξιεπ πληοξτξοίεπ είμαι ποξρπελάριμεπ μόμξ μέρα ρε μία
κλάρη.
• Κάπξιεπ πληοξτξοίεπ είμαι ποξρπελάριμεπ ένχ από ςημ κλάρη
αλλά μόμξ ρε ρσγγεμείπ κλάρειπ.
• Κάπξιεπ πληοξτξοίεπ είμαι ποξρπελάριμεπ γεμικά.
• Ο καλόπ αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ κοαςά ςιπ
πληοξτξοίεπ όρξ πιξ ιδιχςικέπ γίμεςαι.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Οοξλξγία (ρσμέυεια)

Πξλσμξοτιρμόπ (Polymorphism)
• Ασςόπ αματέοεςαι ρςημ αλληλεπίδοαρη μεςανύ αμςικειμέμχμ. Σα
αμςικείμεμα ρυεςίζξμςαι μέρα ρςξ ρύρςημα και με ςξμ ένχ κόρμξ με ςιπ
εμέογειεπ.

• Η ίδια εμέογεια μπξοεί μα παοαρςαθεί με μία ρειοά από διατξοεςικξύπ


ςοόπξσπ.

• Ο πξλσμξοτιρμόπ είμαι υαοακςηοιρςικό ςχμ εμεογειώμ, όυι ςχμ


αμςικειμέμχμ. Είμαι η δσμαςόςηςα πξσ παοέυξσμ ξι αμςικειμεμξρςοατείπ
γλώρρεπ ποξγοαμμαςιρμξύ ρςα αμςικείμεμα μα ρσμπεοιτέοξμςαι
διατξοεςικά, αμάλξγα με ςξμ ςοόπξ με ςξμ ξπξίξ υοηριμξπξιξύμςαι.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεξθόξηωζε ηνπ ηειεζηή +: Η


ππεξθόξηωζε είλαη ραξαθηεξηζηηθό
ηνπ πνιπκνξθηζκνύ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Οοξλξγία (ρσμέυεια)
Κληοξμξμικόςηςα (Inheritance)
• Δίμαρςε ενξικειχμέμξι με ςξ πώπ κάπξια υαοακςηοιρςικά πεομξύμ
από ςξσπ γξμείπ ρςα παιδιά.

• ΢ςξμ αμςικειμεμξρςοατή ποξγοαμμαςιρμό ξι κλάρειπ μπξοξύμ μα


ξμαδξπξιηθξύμ ρε ιεοαουίεπ, όπξσ ςα καςώςεοα επίπεδα ςηπ
ιεοαουίαπ (ςα παιδιά) μξιοάζξμςαι ςα ίδια υαοακςηοιρςικά με ςα
αμώςεοα επίπεδα (ξι γξμείπ).

• Η κληοξμξμικόςηςα είμαι η δσμαςόςηςα παοαγχγήπ μίαπ μέαπ


κλάρηπ από μία σπάουξσρα (βαρική). Η μέα κλάρη (παοάγχγη)
κληοξμξμεί όλα ςα υαοακςηοιρςικά και ςιπ λειςξσογίεπ ςηπ
βαρικήπ κλάρηπ, αλλά ςασςόυοξμα μπξοεί μα ξοίρει ςα δικά ςηπ
επιπλέξμ υαοακςηοιρςικά και λειςξσογίεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Οοξλξγία (ρσμέυεια)

Δπαμαυοηριμξπξίηρη (reusability)
• Μία κλάρη , ατξύ δημιξσογηθεί, μπξοεί μα διαμεμηθεί για μα
υοηριμξπξιηθεί ρε πξλλά ποξγοάμμαςα. Ασςό καλείςαι
επαμαυοηριμξπξίηρη και είμαι ραμ ςιπ βιβλιξθήκεπ
ρσμαοςήρεχμ πξσ υοηριμξπξιξύμ ξι διαδικαρςικέπ γλώρρεπ.
• ΢ςξμ αμςικειμεμξρςοατή ποξγοαμμαςιρμό, με ςημ έμμξια ςηπ
κληοξμξμικόςηςαπ δίμεςαι η δσμαςόςηςα μα επεκςαθεί η
έμμξια ςηπ επαμαυοηριμξπξίηρηπ. Μπξοξύμε μα πάοξσμε μία
σπάουξσρα κλάρη και υχοίπ μα ςημ ςοξπξπξιήρξσμε, μα
ποξρθέρξσμε ρ‟ ασςήμ επιπλέξμ υαοακςηοιρςικά και
δσμαςόςηςεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Η Γλώρρα C++
Δξμή ποξγοάμμαςξπ: Σε παιαηόηεξνπο κεηαγιωηηηζηέο
γξάθνπκε <iostream.h>, ρωξίο ηε
#include <iostream> ρξήζε namespace.
using namespace std;
main()
{
cout << “Hello world“;
}

•Σξ ποόγοαμμα απξςελείςαι από μία ρσμάοςηρη, ςη main().


•Έμα ποόγοαμμα C++ μπξοεί μα απξςελείςαι από πξλλέπ ρσμαοςήρειπ,
κλάρειπ και άλλα ρςξιυεία ποξγοάμμαςξπ, αλλά όςαμ εκςελείςαι, ξ έλεγυξπ
πάμςα μεςαβιβάζεςαι ρςη main(). Η ρσμάοςηρη main() με ςη ρειοά ςηπ, μπξοεί
μα πεοιέυει κλήρειπ ποξπ άλλεπ αμενάοςηςεπ ρσμαοςήρειπ.
•Η ποώςη γοαμμή ςξσ ποξγοάμμαςξπ είμαι μία ξδηγία ποξ-επενεογαρςή
(preprocessor directive), δηλαδή μία εμςξλή ποξπ ςξμ μεςαγλχςςιρςή για μα
παοεμβάλει έμα άλλξ αουείξ ρςξ πηγαίξ ποόγοαμμα.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ένξδξπ δεδξμέμχμ

Σξ αμαγμχοιρςικό cout είμαι ρςημ ξσρία έμα αμςικείμεμξ.


Έυει ποξκαθξοιρθεί μα αμςιρςξιυεί ρςξ οεύμα καθιεοχμέμηπ
ενόδξσ (standard output stream). Σξ οεύμα αματέοεςαι ρςη
οξή δεδξμέμχμ. Σξ οεύμα καθιεοχμέμηπ ενόδξσ καμξμικά
καςεσθύμεςαι ρςημ ξθόμη, αμ και μπξοεί μα καςεσθσμθεί και
ποξπ άλλεπ ρσρκεσέπ ενόδξσ.

Ο ςελερςήπ << ξμξμάζεςαι ςελερςήπ παοεμβξλήπ (insertion) ή


ςξπξθέςηρηπ (put to). Καςεσθύμει ςα πεοιευόμεμα ςηπ
μεςαβληςήπ πξσ είμαι ρςα δενιά ςξσ, ποξπ ςξ αμςικείμεμξ
πξσ είμαι ρςα αοιρςεοά ςξσ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

΢υόλια

Μπξοξύμ μα υοηριμξπξιηθξύμ ρυόλια ρε έμα ποόγοαμμα με


δύξ ςοόπξσπ:

// ρυόλια μίαπ γοαμμήπ

/* ρυόλια
πξλλώμ
γοαμμώμ */

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Είρξδξπ δεδξμέμωμ
#include <iostream>
using namespace std;
main()
{
int qty, price, value;
cout << “Δώρε πξρόςηςα:”;
cin >> qty;
cout << “Δώρε ςιμή μξμάδξπ:”;
cin >> price;
value = qty * price;
cout << “Η ανία ςξσ ποξϊόμςξπ είμαι:” << value;
}
•Η ποόςαρη cin >> qty σπξυοεώμει ςξ ποόγοαμμα μα πεοιμέμει από ςξμ υοήρςη μα πληκςοξλξγήρει έμαμ αοιθμό. Ο
αοιθμόπ πξσ δίμεςαι ςξπξθεςείςαι ρςη μεςαβληςή qty.
•Η δερμεσμέμη λένη cin είμαι έμα αμςικείμεμξ, ποξκαθξοιρμέμξ ρςη C++ μα αμςιρςξιυεί ρςξ οεύμα καθιεοωμέμηπ
ειρόδξσ. Ασςό ςξ οεύμα αμαπαοιρςά δεδξμέμα πξσ έουξμςαι ρσμήθωπ από ςξ πληκςοξλόγιξ.
•Τξ >> είμαι ξ ςελερςήπ πξσ τέομει ςημ ςιμή πξσ βοίρκεςαι αοιρςεοά ςξσ και ςημ ςξπξθεςεί ρςη μεςαβληςή δενιά ςξσ.
•Επειδή ςξ ποόγοαμμα δε διαβάζει ςημ είρξδξ παοά μόμξ μεςά ςημ πληκςοξλόγηρη ςξσ return, ξ υοήρςηπ μπξοεί μα
διξοθώρει εμδευόμεμξ λάθξπ καςά ςημ ειραγωγή ςιμήπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Χειοιρςέπ
Δίμαι ςελερςέπ πξσ υοηριμξπξιξύμςαι με ςξμ ςελερςή << για μα ςοξπξπξιξύμ ή μα υειοίζξμςαι ςα δεδξμέμα χπ
ποξπ ςξμ ςοόπξ πξσ θα εμταμιρςξύμ.

#include <cstdlib> // system


#include <iostream>
#include <iomanip> // std::setw
using namespace std;
main()
{
float radius, perim, area;
const float PI = 3.14159;
cout<<"Give circle's radius:";
cin >> radius;
perim = 2 * PI *radius; Καθξοιρμόπ
area = PI * radius * radius; ςξσ μήκξσπ
cout<<setw(8)<<"Perimeter:"<<setw(8)<<setprecision(3)<<perim<<endl;
πεδίξσ
cout<<setw(8)<<"Area:"<<setw(8)<<setprecision(3)<<area<<endl;
system("PAUSE");
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Χειοιρςέπ (ρσμέυεια)
O υειοιρςήπ setprecision(n) καθξοίζει χπ n ςξμ αοιθμό ςχμ φητίχμ ρε ςιμέπ μεςαβληςώμ
κιμηςήπ σπξδιαρςξλήπ. Δάμ όμχπ ποξηγηθεί ξ ςελερςήπ fixed, ξ υειοιρςήπ
setprecision(n) καθξοίζει χπ n ςξμ αοιθμό ςχμ δεκαδικώμ φητίχμ ρε ςιμέπ μεςαβληςώμ
κιμηςήπ σπξδιαρςξλήπ:
#include <iostream>
#include <iomanip>
using namespace std;
main()
{
int i=-17;
float x=17.689;
cout << endl << setw(8) << i << "," << setw(8) << x;
cout << endl << endl << setprecision(3) << x << endl;
cout << fixed << endl << setprecision(2) << x;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Τύπξι δεδξμέμωμ
Τύπος Από ΄Εως Ψηφία Bytes μνήμης
ακρίβειας
char -128 127 1

int -32768 32767 2

long -2147483648 2147483647 4

float 3.4*10-38 3.4*1038 7 4

double 1.7*10-308 1.7*10308 15 8

long double 3.4*10-4932 1.1*104932 19 10

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπή ςύπωμ
Όςαμ δύξ ςελερςαίξι διατξοεςικξύ ςύπξσ εμταμίζξμςαι
ρςημ ίδια παοάρςαρη, η μεςαβληςή καςώςεοξσ ςύπξσ
μεςαςοέπεςαι ρςξμ ςύπξ ςηπ μεςαβληςήπ αμώςεοξσ ςύπξσ,
δηλαδή:
Τύπξπ δεδξμέμχμ Σειοά
long double Αμώςεοξπ
double
float
long
int
char Kαςώςεοξπ
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ποξραομξγέπ ςύπχμ (casting)


Αματέοεςαι ρςιπ μεςαςοξπέπ δεδξμέμχμ πξσ καθξοίζξμςαι από ςξμ ποξγοαμμαςιρςή, ρε αμςίθερη
με ςιπ ασςόμαςεπ μεςαςοξπέπ δεδξμέμχμ πξσ έυξσμ πεοιγοατεί.

#include <iostream>
using namespace std;
main()
{
int x = 25000;
x = (x * 10) / 10; // υχοίπ ποξραομξγή
cout << “x = “ << x << endl;
x = 25000 ;
x = (long(x) * 10) / 10 ; // ποξραομξγή ρε ςύπξ long
cout << “x = “ << x << endl;
}
Η ένξδξπ ςξσ ποξγοάμμαςξπ θα είμαι:
x = -1214
x = 25000
΢ςημ ποώςη παοάρςαρη υχοίπ ποξραομξγή, ςξ γιμόμεμξ x*10 είμαι μεγάλξ για μα απξθηκεσςεί ρε
μεςαβληςή ςύπξσ int.
΢ςη δεύςεοη παοάρςαρη ξ ςύπξπ ςηπ μεςαβληςήπ μεςαςοέπεςαι ρε long και έςρι ςξ γιμόμεμξ 250000
μπξοεί μα απξθηκεσςεί ρςη μεςαβληςή.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Τελερςέπ
Αοιθμηςικξί
+, -, /, *, \ ακέοαιξ πηλίκξ, % ακέοαιξ σπόλξιπξ

Αύνηρηπ
++

Μείχρηπ
--

Απόδξρηπ ςιμήπ
=, +=, -=, *=, /=, %=

Σσρυεςιρςικξί
<, >, <=, >=, ==, !=

Λξγικξί
&& (and), || (or), ! (not)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Βοόυξι και απξτάρειπ

Δξμή επιλξγήπ
• Απλή επιλξγή
• Σύμθεςη επιλξγή
• Eμτχλεσμέμη επιλξγή
• Πξλλαπλή επιλξγή

Δξμή Επαμάληφηπ
• Επαμαληπςικό ρυήμα με αουικό έλεγυξ επαμάληφηπ
• Επαμαληπςικό ρυήμα με ςελικό έλεγυξ επαμάληφηπ
• Επαμαληπςικό ρυήμα ρσγκεκοιμέμξσ αοιθμξύ επαμαλήφεχμ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δξμέπ επιλξγήπ
Απλή επιλξγή:
if (x > 0)
cout << “x is positive”;
Σύμθεςη επιλξγή:
if (x > 0)
cout << “x is positive”;
else
cout << “x is negative or zero”;
Eμτχλεσμέμη επιλξγή:
if (x > 0)
cout << “x is positive”;
else
if (x == 0)
cout << “x is zero”;
else
cout << “x is negative”;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δξμέπ επιλξγήπ
Πξλλαπλή επιλξγή
1η έκδξρη (με εμτχλεσμέμεπ if):
if (grade > 8)
cout << “excellent”;
else
if (grade > 6)
cout << “very good”;
else
if (grade == 6)
cout << “good”;
else
if (grade == 5)
cout << “pass”;
else
cout << “fail”;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δξμέπ επιλξγήπ
2η έκδξρη (με ςημ εμςξλή switch):
switch (grade)
{
case 9, 10: cout << “excellent”;
break;
case 7, 8: cout << “very good”;
break;
case 6: cout << “good”;
break;
case 5: cout << “pass”;
break;
default : cout << “fail”;
break;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δξμέπ επαμάληφηπ
Επαμαληπςικό ρυήμα με αουικό έλεγυξ επαμάληφηπ:
sum = 0;
cin >> x;
while (x != 0)
{
sum = sum + x;
cin >> x;
}
cout << sum;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δξμέπ επαμάληφηπ
Επαμαληπςικό ρυήμα με έλεγυξ επαμάληφηπ ρςξ ςέλξπ:
do
{
cout << “1. ΔΙ΢ΑΓΩΓΗ” << endl;
cout << “2. ΔΙΑΓΡΑΥΗ” << endl;
cout << “3. ΔΜΥΑΝΙ΢Η” << endl;
cout << “4. ΔΞΟΔΟ΢” << endl;
cout << “Δώρε επιλξγή:”;
cin >> x;
switch (x)
{
case 1: cout << “ΔΙ΢ΑΓΩΓΗ”;
break;
case 2: cout << “ΔΙΑΓΡΑΥΗ”;
break;
case 3: cout << “ΔΜΥΑΝΙ΢Η”;
break;
}
} while (x != 4);

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δξμέπ επαμάληφηπ

Επαναληπηικό ζτήμα με ζσγκεκριμένο αριθμό επαναλήυεφν:


sum = 0;
for (i=0; i<10; i++)
{
cin >> x;
sum = sum + x;
}
cout << sum;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


΢σμαοςήρειπ
Η υοήρη μίαπ ρσμάοςηρηπ ρε έμα ποόγοαμμα πεοιλαμβάμει ςοία ρςάδιξ:
• Δήλχρη
• Οοιρμόπ
• Κλήρη

• ΢ςξ ρςάδιξ ςηπ δήλχρηπ μίαπ ρσμάοςηρηπ, δηλώμξσμε ρςξ μεςαγλχςςιρςή


όςι θα υοηριμξπξιήρξσμε ρςξ ποόγοαμμά μαπ ςη ρσμάοςηρη.

• ΢ςξ ρςάδιξ ςξσ ξοιρμξύ πεοιγοάτξσμε ςη λειςξσογία ςηπ ρσμάοςηρηπ


(δηλαδή γοάτξσμε ςξμ κώδικά ςηπ).

• ΢ςξ ρςάδιξ ςηπ κλήρηπ υοηριμξπξιξύμε ςη ρσμάοςηρη (δηλαδή εκςελξύμε


ςξμ κώδικά ςηπ).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Oοιρμόπ ρσμάοςηρηπ
<ςύπξπ δεδξμέμχμ επιρςοξτήπ> <όμξμα ρσμάοςηρηπ> <λίρςα παοαμέςοχμ>
{
<δήλχρη ςξπικώμ μεςαβληςώμ>
<κώδικαπ ρσμάοςηρηπ>
}

• Όλεπ ξι ρσμαοςήρειπ ςελειώμξσμ και επιρςοέτξσμ ασςόμαςα ρςη


διαδικαρία από ςημ ξπξία κλήθηκαμ, όςαμ ρσμαμςήρξσμ ςξ ςελεσςαίξ ςξσπ
άγκιρςοξ. Μαζί ςξσπ επιρςοέτξσμ – ρσμήθχπ – και μία ςιμή, η ξπξία
πεοικλείεςαι ρςημ εμςξλή return.
• Όςαμ όμχπ δεμ επιθσμξύμε μία ρσμάοςηρη μα επιρςοέτει ςιμή, ςόςε
ποέπει μα γοάφξσμε ςη δερμεσμέμη λένη void αμςί για ςξμ ςύπξ
δεδξμέμχμ επιρςοξτήπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Kλήρη ρσμάοςηρηπ

• κλήρη κας‟ ανία


(call by value)
• κλήρη κας‟ αματξοά
(call by reference)
• κλήρη με υοήρη δεικςώμ, σπξπεοίπςχρη ςηπ κλήρηπ
κας‟ αματξοά
(call using pointers)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη κας‟ ανία (call by value),


ρσμάοςηρη με επιρςοξτή ςιμήπ

int athroisma(int x, int y)


{
int z; // ςξπική μεςαβληςή
z = x + y;
return z ;
}

// κλήρη ρσμάοςηρηπ
c = athroisma(a,b);

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη κας‟ ανία (call by value),
ρσμάοςηρη υχοίπ επιρςοξτή ςιμήπ

void athroisma(int x, int y)


{
int z; // ςξπική μεςαβληςή
z = x + y;
cout << “Σξ άθοξιρμα ςχμ” << x << “ και ” << y << “
είμαι ” << z;
return 0;
}

// κλήρη ρσμάοςηρηπ
athroisma(a,b);

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Παοάδειγμα με ςξπικέπ μεςαβληςέπ


#include <iostream>

using namespace std; float square (float x);


main () {
float in,out;
Ίδηα νλόκαηα ηνπηθώλ κεηαβιεηώλ
in = -4.0;
out = square(in);
cout << in << “ squared is ” << out << endl;

}
Απνηέιεζκα ζηελ νζόλε out=16.0
float square (float x)
{
float out;
out = 24.5; out=24.5 κέζα ζηελ square
return (x*x);
}
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Παοάδειγμα με καθξλικέπ μεςαβληςέπ
#include <iostream>
using namespace std; float glob; // καθξλική μεςαβληςή
float square (float x); Zεηά από ηε square() ην ηεηξάγωλν ηεο
main () { glob,
float in; δειαδή ην ηεηξάγωλν ηνπ 2.0
glob = 2.0;
in = square(glob);
cout << glob << “ squared is ” << in << endl;
in = square(glob);
cout << glob << “ squared is ” << in << endl;
}
Τώξα δεηά από ηε square() ην ηεηξάγωλν ηε
float square (float x) { λέαο ηηκήο ηεο glob, δειαδή ην ηεηξάγωλν
glob=glob+1.0; ηνπ 3.0
return (x*x); }
Η glob γίλεηαη 3.0

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δμβέλεια μεςαβληςώμ (scope)

• Δμβέλεια ποξγοάμμαςξπ: μεςαβληςέπ ασςήπ ςηπ εμβέλειαπ είμαι ξι καθξλικέπ.


Δίμαι ξοαςέπ από όλεπ ςιπ ρσμαοςήρειπ ςξσ ποόγοαμμαςξπ, έρςχ κι αμ
βοίρκξμςαι ρε διατξοεςικά αουεία πηγαίξσ κώδικα.
• Δμβέλεια αουείξσ: μεςαβληςέπ ασςήπ ςηπ εμβέλειαπ είμαι ξοαςέπ μόμξ ρςξ
αουείξ πξσ δηλώμξμςαι και μάλιρςα από ςξ ρημείξ ςηπ δήλχρήπ ςξσπ και κάςχ.
Μεςαβληςή πξσ δηλώμεςαι με ςη λένη κλειδί static ποιμ από ςξμ ςύπξ, έυει
εμβέλεια αουείξσ, π.υ. static int velocity.
• Δμβέλεια ρσμάοςηρηπ: Ποξρδιξοίζει ςημ ξοαςόςηςα ςξσ ξμόμαςξπ από ςημ αουή
ςηπ ρσμάοςηρηπ έχπ ςξ ςέλξπ ςηπ. Δμβέλεια ρσμάοςηρηπ έυξσμ μόμξ ξι goto
εςικέςεπ.
• Δμβέλεια μπλξκ: Ποξρδιξοίζει ςημ ξοαςόςηςα από ςξ ρημείξ δήλχρηπ έχπ ςξ
ςέλξπ ςξσ μπλξκ ρςξ ξπξίξ δηλώμεςαι. Μπλξκ είμαι έμα ρύμξλξ από ποξςάρειπ,
ξι ξπξίεπ πεοικλείξμςαι ρε άγκιρςοα. Μπλξκ είμαι η ρύμθεςη ποόςαρη αλλά και
ςξ ρώμα ρσμάοςηρηπ. Δμβέλεια μπλξκ έυξσμ και ςα ςσπικά ξοίρμαςα ςχμ
ρσμαοςήρεχμ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δμβέλεια μεςαβληςώμ (ρσμέυεια)

Η C++ επιςοέπει ςη υοήρη εμόπ ξμόμαςξπ για ςημ αματξοά ρε


διατξοεςικά αμςικείμεμα, με ςημ ποξϋπόθερη όςι ασςά έυξσμ
διατξοεςική εμβέλεια ώρςε μα απξτεύγεςαι η ρύγκοξσρη
ξμξμάςχμ (name conflict). Δάμ ξι πεοιξυέπ εμβέλειαπ έυξσμ
επικάλσφη, ςόςε ςξ όμξμα με ςη μικοόςεοη εμβέλεια
απξκούπςει (hides) ςξ όμξμα με ςη μεγαλύςεοη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Παοάδειγμα ρςαςικώμ μεςαβληςώμ:

#include <iostream>
using namespace std;
float get_average(float newdata); // δήλωρη ρσμάοςηρηπ
main()
{
float data=1.0;
float average;
while (data!=0)
{
cout << “Give a number or press 0 to finish: ”
cin >> data;
average=get_average(data);
cout << endl << “The new average is ” << average;
}
} // ςέλξπ ςηπ main, ρσμέυεια ρςημ επόμεμη διατάμεια

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


float get_average(float newdata)
{
static float total=0.0;
static int count=0;
count++;
total=total+newdata;
return(total/count);
} //end of get_average

Εκηελούνηαι μόνο ηην ππώηη θοπά. Τιρ επόμενερ διαηηπούν ηο αποηέλεζμα


ηηρ πποηγούμενηρ κλήζηρ και ζε αςηό πποζηίθενηαι ζηη μεν total ηο
newdata, ζηη δε count η μονάδα.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Αποηέλεζμα:

10/1=10

(10+20)/2=15

(30+30)/3=20

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Αμαδοξμικόςηςα (recursion)

Μία ρσμάοςηρη ξμξμάζεςαι αμαδοξμική όςαμ μία εμςξλή ςξσ ρώμαςξπ ςηπ ρσμάοςηρηπ καλεί ςξμ ίδιξ ςηπ ςξμ
εασςό. Η αμαδοξμή είμαι μία διαδικαρία με ςημ ξπξία ξοίζξσμε κάςι μέρχ ςξσ ίδιξσ ςξσ ξοιζόμεμξσ.

Παράδειγμα: Να νξηζζεί ζπλάξηεζε πνπ ππνινγίδεη ην άζξνηζκα ησλ αξηζκώλ από 1


έσο n. (επεξηγήζειρ ζηην επόμενη διαθάνεια)
1ος ηρόπος: 2ος ηρόπος (με αναδρομή):
int sum(int n) int sum(int n)
{ {
int i, total=0; if (n<=1) return(n);
for (i=0;i<=n;i++) else return(sum(n-1)+n);
}
total+=i;
return(total);
Μέζα ζηε sum() θαιείηαη ν εαπηόο ηεο.
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Επενηγήρειπ:
if (n<=1) return(n);
else return(sum(n-1)+n);
Δάμ ςξ n είμαι ίρξ με 1, ςόςε ςξ άθοξιρμα ςασςίζεςαι με ςξ n (ξοιακή πεοίπςχρη). ΢ςη
γεμική πεοίπςχρη, θεχοξύμε όςι ξ σπξλξγιρμόπ ςξσ αθοξίρμαςξπ n μπξοεί μα θεχοηθεί
χπ σπξλξγιρμόπ ςξσ αθοξίρμαςξπ ςχμ αοιθμώμ από ςξ 1 έχπ ςξ n-1 ρσμ ςξ n. Αμςίρςξιυα,
ξ σπξλξγιρμόπ ςξσ αθοξίρμαςξπ n-1 μπξοεί μα θεχοηθεί χπ σπξλξγιρμόπ ςξσ αθοξίρμαςξπ
ςχμ αοιθμώμ από ςξ 1 έχπ ςξ n-2 ρσμ ςξ n-1. Ακξλξσθώμςαπ ςημ παοαπάμχ διαδικαρία,
μπξοξύμε μα ξοίρξσμε ςα ενήπ:
1+…+n = (1+…+(n-1)) + n
(1+…+(n-1)) = (1+…+(n-2)) + (n-1)
(1+…+(n-2)) = (1+…+(n-3)) + (n-2)
(1+…+(n-3)) = (1+…+(n-4)) + (n-3)
κ.ξ.κ.

Από ςα παοαπάμχ ποξκύπςει όςι κάθε ρυέρη είμαι ίδια με ςημ ποξηγξύμεμη, με απλή
αλλαγή ςχμ ξοιρμάςχμ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Τι ρημαίμει όμχπ ασςό;
Σημ ποώςη τξοά καλείςαι η ρσμάοςηρη sum() με όοιρμα n. Με ςημ ποόςαρη return(sum(n-1)+n) η
sum() καλεί ςξμ ίδιξ ςηπ ςξμ εασςό με διατξοεςικό όμχπ όοιρμα (n-1). Η εμεογξπξίηρη ασςή θα
ποξκαλέρει με ςη ρειοά ςηπ μέα εμεογξπξίηρη και ασςό θα ρσμευιρθεί έχπ όςξσ ποξκληθεί διακξπή.
Η διακξπή είμαι απξκλειρςική εσθύμη ςξσ ποξγοαμμαςιρςή. ΢ςξ ρσγκεκοιμέμξ παοάδειγμα η διακξπή
ποξκαλείςαι με ςημ ποόςαρη if (n<=1) return(n) ,πξσ ρημαίμει όςι όςαμ ςξ n τθάρει μα γίμει 1 σπάουει
πλέξμ απξςέλερμα. Έςρι ξι διαδξυικέπ κλήρειπ για n=4 είμαι:
sum(4) καλεί ςη sum(3)
sum(3) καλεί ςη sum(2)
sum(2) καλεί ςη sum(1)
η sum(1) δίμει απξςέλερμα 1 και ςξ επιρςοέτει ρςη sum(2)
η sum(2) δίμει απξςέλερμα 1+2=3 και ςξ επιρςοέτει ρςη sum(3)
η sum(3) δίμει απξςέλερμα 3+3=6 και ςξ επιρςοέτει ρςη sum(4)
η sum(4) δίμει απξςέλερμα 6+4=10, ςξ ξπξίξ είμαι και ςξ ςελικό
Σξ πλήοεπ ποόγοαμμα έυει ςημ ακόλξσθη μξοτή:

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

#include <iostream>
# include <cstdlib>
using namespace std;
int sum(int n); // δήλωρη ςηπ ρσμάοςηρηπ sum
int number_of_calls=0;
void main(){
int n=4; // αμάθερη n=4
cout << endl << “ n= ” n;
cout << endl << “ Sum = ” << sum(n);
cout << endl << endl;
system(“PAUSE”);
} // ςέλξπ ςηπ main
int sum(int n){ // ξοιρμόπ ςηπ ρσμάοςηρηπ sum
if (n<=1){
number_of_calls++;
cout << endl << “Number of calls:” << number_of_calls;
return(n);
}
else{
number_of_calls++;
cout << endl << “Number of calls:” << number_of_calls;
return(sum(n-1)+n);
}
} // ςέλξπ ςηπ sum

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Αποηέλεζμα:

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δήλχρη δείκςη
Δείκηηρ: κία κεηαβιεηή πνπ θξαηά μία διεύθςνζη.
Δηεύζπλ. Πεξηερόκ.
900 : x , 32 Καλνληθή κεηαβιεηή.

904 : Όλνκα: x, Τηκή: 32, Tύπνο: int


908 : px, 900 Μεηαβιεηή δείθηε.
Όλνκα: px, Τηκή: 900, Tύπνο: δείθηεο ζε int
Λέκε όηη ν px δείρλεη ζηελ x
900 :
Φαληαζηείηε έλα ηόμν από ηε κεηαβιεηή δείθηε ζηελ x , 32
θαλνληθή κεηαβιεηή, ην νπνίν δείρλεη πνύ “δείρλεη” ν
δείθηεο.
px, 900
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Δήλχρη δείκςη

Ο δείθηεο πξέπεη λα δειωζεί:

base_type * pointer_name ;

ν ηύπνο ηεο κεηαβιεηήο απνζεθεύεηαη ην όλνκα ηεο κεηαβιεηήο δείθηε. Καιή


ζηε ζέζε πνπ δείρλεη ν δείθηεο πξνγξακκαηηζηηθή πξαθηηθή: ην πξώην
γξάκκα ηνπ νλόκαηνο λα είλαη πάληνηε p

Πξνζδηνξίδεη όηη δειώλεηαη


κία κεηαβιεηή δείθηε

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δήλχρη δείκςη
Γιαςί ποέπει μα δηλχθεί ξ ςύπξπ ςηπ καμξμικήπ μεςαβληςήπ;

Γιαςί όςαμ δηλώμεςαι μία (καμξμική) μεςαβληςή, δερμεύεςαι ρσγκεκοιμέμη μμήμη, π.υ. 8
bytes για double, 4 bytes για int.

Ο δείκςηπ αματέοεςαι ρε μία διεύθσμρη, ρςημ ξπξία απξθηκεύεςαι η ςιμή μίαπ καμξμικήπ
μεςαβληςήπ.

Ο δείκςηπ υοηριμξπξιείςαι για μα γίμεςαι έμμερη αματξοά ρ‟ ασςήμ ςημ ςιμή. Έςρι,
ποέπει μα γμχοίζξσμε πόρη ακοιβώπ μμήμη καςαλαμβάμει ασςή η ςιμή.

Πόρη μμήμη καςαλαμβάμει η ίδια η μεςαβληςή δείκςη;


Η διεύθσμρη είμαι έμαπ ακέοαιξπ, έςρι ξ δείκςηπ καςαλαμβάμει 4 bytes, αμενάοςηςα από
ςξμ ςύπξ ςηπ καμξμικήπ μεςαβληςήπ πξσ δείυμει.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δήλχρη δείκςη

Ο αρςεοίρκξπ ρσμδέεςαι με ςξ όμξμα κι όυι με ςξμ ςύπξ:

int *pcount; // δείκςηπ ρε ακεοαίξσπ, με ξμξμαρία pcount

int *pcount, *pnum; // δείκςεπ ρε ακεοαίξσπ, με ξμξμαρίεπ pcount και


pnum

int *pcount, number; /* έμαπ δείκςηπ ρε ακέοαιξ, με ξμξμαρία pcount και


έμαπ ακέοαιξπ με ξμξμαρία number */

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δήλχρη δείκςη
Πώπ επιλέγεςαι ςξ όμξμα εμόπ δείκςη;

Οι ίδιεπ ρσμβάρειπ πξσ ιρυύξσμ ρςιπ καμξμικέπ μεςαβληςέπ.

Ωρςόρξ, ρσμήθχπ ξ αουικόπ υαοακςήοαπ ςξσ ξμόμαςξπ δείκςη είμαι ςξ p, έςρι


ώρςε ςξ ποόγοαμμα μα καθίρςαςαι πεοιρρόςεοξ εσαμάγμχρςξ, καθώπ με
ςξμ ποώςξ υαοακςήοα ταίμεςαι εάμ μία μεςαβληςή είμαι δείκςηπ ή όυι.
Δμαλλακςικά, μπξοξύμε μα ποξρθέςξσμε ςημ καςάληνη _ptr.

Παοάδειγμα:
int *pcount, *count_ptr; // δείκςεπ ρε ακεοαίξσπ
char *pword, *word_ptr; // δείκςεπ ρε υαοακςήοεπ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Αουικξπξίηρη δεικςώμ
1) Φοηριμξπξιώμςαπ πίμακα
(Τπεμθύμιρη:ςξ όμξμα εμόπ πίμακα είμαι μία διεύθσμρη.

numArray
60 1
int numArray[5] = {1,2,3,4,5}; 64 2 pint
68 3
int *pint; 72 4
pint = numArray; 76 5
80

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Αουικξπξίηρη δεικςώμ

2) Φοηριμξπξιώμςαπ άλλξσπ δείκςεπ ίδιξσ ςύπξσ

numArray
60 1
int numArray[5] = {1,2,3,4,5}; 64 2 pint
int *pint, *pnum; 68 3 pnum
72 4
pint = numArray; 76 5
pnum = pint; 80

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Αουικξπξίηρη δεικςώμ

3) Φοηριμξπξιώμςαπ αοιθμηςική δεικςώμ

int numArray[5] = {1,2,3,4,5}; numArray


int *pint, *pnum; 60 1
64 2 pint
pint = numArray;
68 3 pnum
pnum = pint+2; 72 4
76 5
Πήγαηλε δύν ζέζεηο πην θάηω 80
(κε πεξηερόκελν αθεξαίνπ)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Αουικξπξίηρη δεικςώμ
4) Φοηριμξπξιώμςαπ ςξμ ςελερςή διεύθσμρηπ &
(address-of operator)

int *pnum;
int count;
pnum = &count;

H γοαμμή ασςή αματέοει: ξ pnum μα λάβει χπ ςιμή ςη


διεύθσμρη ςηπ μεςαβληςήπ count, δηλαδή ξ δείκςηπ pnum μα
“δείυμει” ρςη μεςαβληςή count.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ακξλξύθχπ ταίμεςαι πώπ μπξοξύμε μα ποξρπελάρξσμε
ςημ ςιμή μίαπ μεςαβληςήπ με ςη υοήρη δείκςη.

int *pcount, num;


num = 10; 900 : pcount, junk
pcount = &num; 904 : num, junk
*pcount = 20;
908 :

...

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

int *pcount, num;


num = 10; 900 : pcount, junk
pcount = &num; 904 : num, 10
*pcount = 20;
908 :

...

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


int *pcount, num;
num = 10; 900 : pcount, 904
pcount = &num; 904 : num, 20
*pcount = 20;
908 :

...
Ο αρςεοίρκξπ σπξδηλώμει όςι ποέπει μα ακξλξσθηθεί ςξ
βέλξπ για μα ποξρπελαρθξύμ ςα δεδξμέμα ςηπ θέρηπ, ρςημ
ξπξία δείυμει.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

*pcount = 20;

Ο αρςεοίρκξπ ξμξμάζεςαι ςελερςήπ πεοιευξμέμξσ


(dereferencing operator).

Διαβάζεςαι “ρςη διεύθσμρη”.

Φοηριμξπξιείςαι για μα ποξρπελαύμει ςα πεοιευόμεμα ςηπ


θέρηπ μμήμηπ ρςημ ξπξία δείυμει ξ δείκςηπ.

Δε θα ποέπει μα ρσγυέεςαι με ςξμ αρςεοίρκξ ςηπ δήλχρηπ


δείκςη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δταομξγή δεικςώμ
void main()
{
int x=10, y=25;
int *px, *py;
px = &x;
py = &y; Σα ξοίρμαςα ςηπ ρσμάοςηρηπ είμαι
swap(px, py);
δείκςεπ ρε ακέοαιεπ μεςαβληςέπ.
}

void swap (int *pa, int *pb) {


int temp;
Θα υοηριμξπξιήρξσμε
temp = *pa; μαύοξ υοώμα για ςιπ ςξπικέπ
*pa = *pb; μεςαβληςέπ ςηπ main() και
*pb = temp; μπλε για ςιπ ςξπικέπ
} μεςαβληςέπ ςηπ swap().

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

void main()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
address var name, value
int *px, *py;
px = &x; 900: x, 10
py = &y;
904: y, 25
swap(px, py);
} 908:
912:
void swap (int *pa, int *pb) {
int temp;
916:
temp = *pa; 920:
*pa = *pb;
924:
*pb = temp;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
int *px, *py;
address var name, value
px = &x; 900: x, 10
py = &y;
904: y, 25
swap(px, py);
} 908: px, junk
912: py, junk
void swap (int *pa, int *pb) {
int temp; 916:
temp = *pa;
920:
*pa = *pb;
*pb = temp; 924:
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
int *px, *py;
address var name, value
px = &x; 900: x, 10
py = &y;
904: y, 25
swap(px, py);
} 908: px, 900
912: py, junk
void swap (int *pa, int *pb) {
int temp; 916:
temp = *pa; 920:
*pa = *pb;
*pb = temp;
924:
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
address var name, value
int *px, *py;
px = &x; 900: x, 10
py = &y;
904: y, 25
swap(px, py);
} 908: px, 900
912: py, 904
void swap (int *pa, int *pb) {
int temp; 916:
temp = *pa;
*pa = *pb;
920:
*pb = temp; 924:
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
address var name, value
int *px, *py;
px = &x; 900: x, 10
py = &y; y, 25
904:
swap(px, py);
} 908: px, 900
Αληίγξαθν ηεο ηηκήο ηεο py
912: py, 904
void swap (int *pa, int *pb) {
int temp; 916: pa, 900
temp = *pa; 920: pb, 904
*pa = *pb;
*pb = temp; 924:
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
int *px, *py;
address var name, value
px = &x; 900: x, 10
py = &y;
904: y, 25
swap(px, py);
} 908: px, 900
912: py, 904
void swap (int *pa, int *pb) {
int temp; 916: pa, 900
temp = *pa; 920: pb, 904
*pa = *pb;
924: temp, junk
*pb = temp;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
address var name, value
int *px, *py;
px = &x; 900: x, 10
py = &y; y, 25
swap(px, py);
904:
} 908: px, 900
912: py, 904
void swap (int *pa, int *pb) {
int temp; 916: pa, 900
temp = *pa;
920: pb, 904
*pa = *pb;
*pb = temp; 924: temp, 10
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
address var name, value
int *px, *py;
px = &x; 900: x, 25
py = &y;
904: y, 25
swap(px, py);
} 908: px, 900
912: py, 904
void swap (int *pa, int *pb) {
int temp; 916: pa, 900
temp = *pa; pb, 904
920:
*pa = *pb;
*pb = temp; 924: temp, 10
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

void main ()
{ Απεηθόληζε ηεο κλήκεο
int x=10, y=25;
int *px, *py; address var name, value
px = &x;
900: x, 25
py = &y;
swap(px, py); 904: y, 10
} 908: px, 900
912: py, 904
void swap (int *pa, int *pb) {
int temp; 916: pa, 900
temp = *pa;
920: pb, 904
*pa = *pb;
*pb = temp; 924: temp, 10
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


void main ()
Απεηθόληζε ηεο κλήκεο
{
int x=10, y=25; address var name, value
int *px, *py;
px = &x; 900: x, 25
py = &y;
904: y, 10
swap(px, py);
} 908: px, 900
void swap (int *pa, int *pb) { 912: py, 904
int temp;
temp = *pa;
916:
*pa = *pb; 920:
*pb = temp;
} 924:

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δπενηγήρειπ:

Αμ και η ρσμάοςηρη swap() δεμ επιρςοέτει ςίπξςε άμερα ρςη main(), έυει μία παοεμέογεια (side effect).

Όςαμ καλείςαι η swap(), ςα ξοίρμαςά ςηπ είμαι ξι δείκςεπ px και py, ξι ξπξίεπ ρυεςίζξμςαι με ςιπ διεσθύμρειπ ςχμ x
και y, αμςίρςξιυα.
Παοαςήοηρη: δε υοειάζεςαι μα δηλώρξσμε ςξσπ δείκςεπ px και py. Σξ μόμξ πξσ απαιςείςαι είμαι μα πεοαρθξύμ ξι
διεσθύμρειπ ςχμ x και y ρςη swap(), όπχπ ταίμεςαι ακξλξύθχπ:

void main () void swap (int *pa, int *pb)


{
{ int temp;
int x=10, y=25; temp = *pa;
swap(&x, &y); *pa = *pb;
*pb = temp;
}
}

Λειηοσργεί με ηον ίδιο ηρόπο ποσ λειηοσργούζε ηο


πρόγραμμα με ηοσς px και py.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δείκςεπ και ρσμαοςήρειπ

Έωπ ςώοα πεομξύραμε ςξσπ δείκςεπ ωπ ξοίρμαςα ρε ρσμαοςήρειπ.


Μπξοξύμε όμωπ μα επιρςοέτξσμε δείκςεπ;

• Όςαμ επιρςοέτεςαι έμαπ δείκςηπ, θα ποέπει μα δείυμει ρε


δεδξμέμα ςηπ καλξύραπ ρσμάοςηρηπ.
• Δεμ ποέπει πξςέ μα επιρςοέτεςε δείκςη πξσ δείυμει ρε ςξπική
μεςαβληςή ςηπ καλξύμεμηπ ρσμάοςηρηπ, γιαςί όςαμ ςεομαςιρθεί
η ρσμάοςηρη ξι ςξπικέπ μεςαβληςέπ εναταμίζξμςαι.
• Μπξοξύμε μα υοηριμξπξιήρξσμε δείκςη για μα αλλάνξσμε ςξ
πεοιευόμεμξ ςηπ θέρηπ ρςημ ξπξία δείυμει, αλλά δεμ ποέπει μα
αλλάνξσμε ςξμ ίδιξ ςξ δείκςη μέρα ρςημ καλξύμεμη ρσμάοςηρη.
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

void main () {
Aληηγξάθεη ηελ ηηκή ηνπ
int *pscore, num;
pscore (δειαδή ηε δηεύζπλζε
num = 32;
ζηελ νπνία δείρλεη) ζηνλ ptr
pscore = &num;
print(pscore); void print(int *ptr) {
} printf(“%d”, *ptr);
ptr=ptr+1;
}

ΚΑΚΟ! Όηαλ ηππώλεη ε ζπλάξηεζε


ηειεηώλεη θαη ν ptr εμαθαλίδεηαη.
Ο pscore είλαη ό,ηη ήηαλ θαη πξηλ ηελ
θιήζε ηεο ζπλάξηεζεο print.
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
void main () { int *incr(int x) {
int *pscore, num; x = x+10;
num = 32; return &x;
pscore = incr(num); }

} ΛΑΘΟΣ! Όηαλ ηειεηώλεη ε incr, ε x


εμαθαλίδεηαη θαη ε ηηκή ηεο ράλεηαη.
Ωζηόζν, πίζσ ζηε ζπλάξηεζε ν pscore ζα
δείρλεη ζηε δηεύζπλζε πνπ επέζηξεςε από
ηε ζπλάξηεζε αιιά ζα ππάξρεη
«ζθνππίδη» (junk) ζ’ απηή ηε δηεύζπλζε,
εθόζνλ ην x έρεη εμαθαληζζεί.
Σωζηή τρήζη ηης επιζηρεθόμενης
ηιμής διεύθσνζης
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

#include <iostream>
#include <cstdlib> Για να εμθανιζθεί η διεύθσνζη ζε ακέραια μορθή
using namespace std;
int *incr(int *pkitsos);
main() {
int *pscore, *pm, num;
num=32;
pscore=&num;
cout << "addr(num)=" << (int)&num << " addr(pscore)=" << (int)&pscore;
cout << " addr(pm)=" << (int)&pm << " pscore=" << (int)pscore;
cout << endl << endl << "*pscore=" << *pscore << endl << endl;

pm=incr(pscore);

cout << "pm=" << (int)pm << " num=" << num << endl << endl << endl;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


int *incr(int *pk) {
int x;
x=*pk;

cout << "Prior: addr(pk)=" << (int)&pk << " pk=" << (int)pk;
cout << " addr(x)=" << (int)&x << " x=" << x << endl << endl;
x=x+10;

*pk=x;
cout << "*pk=" << *pk << endl << endl;

return(pk);
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

(Υπεμθύμιρη) ΢σμάοςηρη και Πίμακεπ

Εάμ η ποαγμαςική παοάμεςοξπ είμαι όμξμα πίμακα (πυ. key),


ρςέλμει ςη διεύθσμρη ςξσ ποώςξσ byte ςξσ πίμακα.
Η παοάμεςοξπ ρςη δήλωρη ςηπ ρσμάοςηρηπ είμαι έμα όμξμα
ςξπικξύ πίμακα (π.υ. x). Κοαςά έμα αμςίγοατξ ςηπ ίδιαπ
διεύθσμρηπ αλλά υοηριμξπξιεί διατξοεςικό όμξμα.
Παξάκεηξνο ζπλάξηεζεο
Πξαγκαηηθή παξάκεηξνο
setKeyA(float x[], int s)
main () { /* 10 seeded random #s */
{ int i;
float key[10]; srand(s); /* seed it */
setKeyA(key,4); for(i=0; i<10; i++)
} x[i] = rand();
/*key has 10 varied #s */ }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη κας‟ αματξοά
Όςαμ ςα ξοίρμαςα είμαι πίμακεπ, πεομιξύμςαι ρςιπ ρσμαοςήρειπ
„κας‟ αματξοά‟ (call by reference) — και μπξοεί μα είμαι
ΤΟΣΟ είρξδξι ΟΣΟ και ένξδξι.
(Τόρξ η main() όρξ και η setKeyA() μπξοξύμ μα θέρξσμ ςιμέπ
ρε ρςξιυεία πιμάκωμ).
Παξάκεηξνο ζπλάξηεζεο
Πξαγκαηηθή παξάκεηξνο
setKeyA(float x[], int s)
main () { /* 10 seeded random #s */
{ int i;
float key[10]; srand(s); /* seed it */
setKeyA(key,4); for(i=0; i<10; i++)
} x[i] = rand();
/*key has 10 varied #s */ }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη κας‟ αματξοά


Οι δείκηερ επιηπέποςν να πεπνάμε ΟΠΟΙΟΔΗΠΟΤΕ δεδομένο
καη’αναθοπά
Παξάδεηγκα: αιιάδνπκε ηελ setKeyA έηζη ώζηε λα δέρεηαη ωο νξίζκαηα κόλν δείθηεο
θαη δηεπξύλνληαη νη δπλαηόηεηεο.(αλλάζοσμε ηο όνομα ζε setKeyP)

Πξαγκαηηθή
παξάκεηξνο Παξάκεηξνο ζπλάξηεζεο
setKeyP(float *pK, int *pS)
main () { /* 10 seeded random #s */
{ /*double-width key */ int i;
int seed0 = 4; seed1 = 89; srand(pS[0]); /* seed...*/
float key2[20]; for(i=0; i<10; i++)
setKeyP(&key2[0], &seed0); pK[i] = rand();
setKeyP(&key2[10],&seed1); pS[0]=0; /* clear it*/
} }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη κας‟ αματξοά

setKeyP(float *pK, int *pS)


main () { /* 10 seeded random #s */
{ /*double-width key */ int i;
int seed0 = 4; seed1 = 89; srand(pS[0]); /* seed...*/
float key2[20]; for(i=0; i<10; i++)
setKeyP(&key2[0], &seed0); pK[i] = rand();
setKeyP(&key2[10],&seed1); pS[0]=0; /* clear it*/
} /* now seed0,seed1 are 0 */ }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

΢σμαοςήρειπ και Δείκςεπ

Οη πξαγκαηηθέο παξάκεηξνη πνπ είλαη δείθηεο αληηγξάθνπλ κία


διεύθσνζη ζηις παξακέηξνπο ηεο ζπλάξηεζεο, αιιά εάλ
αιιαρζεί ε παξάκεηξνο ζηε ζπλάξηεζε (δει. ε δηεύζπλζε)
ΔΕ ζα αιιαρζεί ε πξαγκαηηθή παξάκεηξνο !!

main () Πξαγκαηηθό όξηζκα Παξάκεηξνο ζπλάξηεζεο


{
double cbn[2]={1.2,5.0}; dfixit(double *x)
double *pC;
pC = &cbn[1];
{
x[0] = 42.0;
OΦΙ!!
dfixit(pC);
} /* now cbn[1]=42.0, */
/* but pC unchanged */
x--; /*move x?*/
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


΢σμαοςήρειπ με ςύπξ επιρςοξτήπ δείκςη
Οη ζπλαξηήζεηο ηωλ νπνίωλ ν ηύπνο επηζηξνθήο είλαη δείθηεο;
ΠΩΣ: η δήλωζη ηηρ ζςνάπηηζηρ μοιάζει:
char* findNextVowel( char* str);
!!ΚΙΝΔΥΝΟΣ!!
Όιεο νη κεηαβιεηέο ηεο ζπλάξηεζεο είλαη ηνπηθέο θαη πξνζωξηλέο.
Μπνξεί λα εμαθαληζζνύλ όηαλ θύγνπκε από ηε ζπλάξηεζε.
Μελ επηζηξέθεηε δείθηεο ζε κε νξηζκέλεο κεηαβιεηέο!

Να μην επιζηπέθεηε ποηέ δείκηερ ΕΚΤΟΣ εάν σπηζιμοποιείηε ηη


λέξη κλειδί “static”

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Παοάδειγμα static
void main()
{ ΣΦΑΛΜΑ
float* pKey;

pKey = setKey(0);
cout << “keys 0,7 are “ << pKey[0] << pKey[7] << endl;
... (κώδικας ποσ δεν αλλάζει ηον pKey) ...
cout << “keys 0,7 are “ << pKey[0] << pKey[7] << endl;
}

float* setKey(int s) /* make a cryptographic key */


{
float keep[10];
int i;
srand(s); /* set rand’s seed */
for(i=0; i<10; i++) keep[i] = rand();
return(keep);
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Παοάδειγμα static
void main()
{
float* pKey;
ΣΦΑΛΜΑ
pKey = setKey(0);
cout << “keys 0,7 are “ << pKey[0] << pKey[7] << endl;
... (code that doesn’t change pKey) ...
cout << “keys 0,7 are “ << pKey[0] << pKey[7] << endl;
}

float* setKey(int s) /* make a cryptographic key */


ΔΙΟΤΙ:
{ Σηελ έμνδν ε πξνζσξηλή
float keep[10];
int i; κεηαβιεηή i θαη ν
srand(s); /* set rand’s seed */ πίλαθαο keep είλαη
for(i=0; i<10; i++) keep[i] = rand();
return(keep); αθαζόξηζηνη
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Παοάδειγμα static
void main()
{ ΣΩΣΤΟ
float* pKey;

pKey = setKey(0);
cout << “keys 0,7 are “ << pKey[0] << pKey[7] << endl;
... (code that doesn’t change pKey) ...
cout << “keys 0,7 are “ << pKey[0] << pKey[7] << endl;
}
Η ιέμε θιεηδί ‘static’ δηαηεξεί ηνλ πίλαθα keep,
αθόκε θαη κεηά ηελ έμνδν από ηε ζπλάξηεζε.
float* setKey(int s) /* make a cryptographic key */
{
static float keep[10];
int i;
srand(s); /* set rand’s seed */
for(i=0; i<10; i++) keep[i] = rand();
return(keep);
}
επιζηροθή(δείκηης)Πάληνηε έιεγμε γηα static!

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ενότητα 2

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Περιεχόμενα ενότητασ
1. Κλάσεις και αμτικείμεμα
2. Οπιζμόρ ανηικειμένων
3. Ιδιωηικά και δημόζια μέλη
4. Κλήζη ζςναπηήζεων-μελών
5. Απόδοζη ηιμών μέζω παπαμέηπων
6. Σςναπηήζειρ εγκαηάζηαζηρ/δόμηζηρ (constructors)
7. Σςναπηήζειρ αποζύνδεζηρ/αποδόμηζηρ (destructors)
8. Σςναπηήζειρ δόμηζηρ με ςπεπθόπηωζη (constructor
overloading)
9. Σςναπηήζειρ-μέλη οπιζόμενερ έξω από ηην κλάζη
10. Σςναπηήζειρ δόμηζηρ – εναλλακηικόρ οπιζμόρ
11. Ανηικείμενα ωρ οπίζμαηα ζςναπηήζεων
12. Επιζηποθή ανηικειμένων από ζςναπηήζειρ
13. Ένηαξη κλάζηρ ζηοςρ ηύποςρ δεδομένων

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλάρειπ και αμςικείμεμα
#include <iostream.h>
class Person
{
private:
char name[30];
int age;
public:
void readData()
{
cout << “Enter name:”;
cin >> name;
cout << “Enter age:”;
cin >> age;
}
void printData()
{
cout << “The name of the person is “ << name << endl;
cout << “The age of the person is “ << age << endl;
}
}; // τέλος κλάσης

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλάρειπ και αμςικείμεμα


void main()
{
Person p1, p2; // δήλωση δύο αμτικειμέμωμ

p1.readData(); // κλήση συμάρτησης μέλους για ορισμό δεδομέμωμ


p1.printData(); // κλήση συμάρτησης μέλους για εμφάμιση δεδομέμωμ
p2.readData();
p2.printData();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Οοιρμόπ αμςικειμέμχμ

Η ποόςαρη
Person p1, p2;
ξοίζει δύξ αμςικείμεμα (objects) ςηπ κλάρηπ Person.

Θα ποέπει μα ςξμιρθεί όςι, όπχπ ρε μία δξμή, όςαμ ςημ


ξοίζξσμε δε δημιξσογξύμε καμία μεςαβληςή δξμήπ, έςρι και
με ςημ κλάρη, όςαμ ςημ ξοίζξσμε δε δημιξσογξύμε
αμςικείμεμα, απλά πεοιγοάτξσμε πώπ θα είμαι ασςά όςαμ
δημιξσογηθξύμ. Τα αμςικείμεμα δημιξσογξύμςαι όςαμ
ξοίζξμςαι, ρύμτχμα με ςημ παοαπάμχ ποόςαρη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ιδιχςικά και δημόρια μέλη


Έμα βαρικό υαοακςηοιρςικό ςξσ αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ
είμαι η απόκοσφη δεδξμέμχμ (data hiding).

•Η έμδεινη private (ιδιωςικά) ρημαίμει όςι ςα δεδξμέμα είμαι κοσμμέμα


μέρα ρε μία κλάρη, έςρι ώρςε μα μημ είμαι ποξρπελάριμα από
ρσμαοςήρειπ πξσ είμαι ένχ από ςημ κλάρη.
•Αμςιθέςχπ, ςα δημόρια (public) δεδξμέμα, ποξρπελαύμξμςαι και ένχ
από ςιπ κλάρειπ.

Σσμήθωπ ςα δεδξμέμα (ή ςξσλάυιρςξμ ςα πεοιρρόςεοα εν ασςώμ) μέρα ρε


μία κλάρη είμαι ιδιωςικά και ξι ρσμαοςήρειπ είμαι δημόριεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη ρσμαοςήρεχμ-μελώμ
Για μα καλέρξσμε μία ρσμάοςηρη-μέλξπ μίαπ κλάρηπ ςη ρσμδέξσμε μέρχ
ςξσ ςελερςή ςελεία με κάπξιξ αμςικείμεμξ:
Αμςικείμεμξ.ρσμάοςηρη-μέλξπ
Η ρύμςανη είμαι παοόμξια με ςξμ ςοόπξ πξσ αματεοόμαρςε ρςα μέλη μίαπ
δξμήπ, με ςιπ παοεμθέρειπ μα σπξδηλώμξσμ όμχπ όςι αματεοόμαρςε ρε
ρσμάοςηρη-μέλξπ και όυι ρε ρςξιυείξ δεδξμέμχμ.
Η ποώςη κλήρη ρςη readData() γίμεςαι χπ ενήπ:
p1.readData();
όπξσ καλείςαι η ρσμάοςηρη-μέλξπ readData() ςξσ αμςικειμέμξσ p1.
Ακξλξύθχπ, εκςελείςαι ξ κώδικαπ ςηπ ρσμάοςηρηπ, όπξσ δίμξμςαι από ςξμ
υοήρςη ςιμέπ για ςξ όμξμα και ςημ ηλικία ςξσ αςόμξσ. Οι ςιμέπ απξδίδξμςαι
ρςα δεδξμέμα ςξσ αμςικειμέμξσ name και age, αμςίρςξιυα.
Η δεύςεοη κλήρη
p2.readData();
καλεί p2.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Απόδξρη ςιμώμ μέρχ παοαμέςοχμ


class Person
{
Εθόζον ηα ιδιωηικά μέλη
private:
char name[30]; δηλώνονηαι ππιν ηα δημόζια, η
int age; λέξη private πεπιηηεύει.
public:
void setData(char name1[], int age1)
{
strcpy(name, name1);
age = age1;
}
void printData()
{
cout << “The name of the person is “ << name << endl;
cout << “The age of the person is “ << age << endl;
}
}; // τέλος κλάσης

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Απόδξρη ςιμώμ μέρχ παοαμέςοχμ
void main()
{
Person p;
p.setData(“PAPADOPOULOS”, 25);
p.printData();
}

Σςξ ποόγοαμμα ασςό ξοίζεςαι έμα αμςικείμεμξ p. Ακξλξύθχπ, με ςημ ποόςαρη


p.setData(“PAPADOPOULOS”, 25);
καλείςαι η ρσμάοςηρη-μέλξπ setData(), ρςημ ξπξία μεςαβιβάζξμςαι ξι ςιμέπ
“PAPADOPOULOS “ και 25 ρςιπ παοαμέςοξσπ name1 και age1, αμςίρςξιυα.
Τέλξπ, όςαμ εκςελείςαι ξ κώδικαπ ςηπ ρσμάοςηρηπ, ξι ςιμέπ ασςώμ ςχμ
παοαμέςοχμ απξδίδξμςαι ρςα δεδξμέμα ςξσ αμςικειμέμξσ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ εγκαςάρςαρηπ/δόμηρηπ
(constructors)
•Μεοικέπ τξοέπ είμαι βξλικό για έμα αμςικείμεμξ μα λαμβάμει άμερα
αουικέπ ςιμέπ, ςημ ποώςη τξοά πξσ δημιξσογείςαι, υχοίπ μα απαιςείςαι
μα καλέρξσμε μία νευχοιρςή ρσμάοςηρη-μέλξπ.

•Η ασςόμαςη απόδξρη αουικώμ ςιμώμ ποαγμαςξπξιείςαι με υοήρη μίαπ


ειδικήπ ρσμάοςηρηπ-μέλξσπ πξσ ξμξμάζεςαι ρσμάοςηρη
εγκαςάρςαρηπ ή δόμηρηπ ή δξμηςήπ (constructor).

•Η ρσμάοςηρη δόμηρηπ είμαι μία ρσμάοςηρη-μέλξπ ςηπ κλάρηπ, η ξπξία


σπξυοεχςικά είμαι είμαι ρσμξμόμαςη με thn κλάρη. Καλείςαι ασςόμαςα
όςαμ δηλώμεςαι έμα αμςικείμεμξ ςηπ κλάρηπ. Οι δξμηςέπ
υοηριμξπξιξύμςαι για ςημ αουικξπξίηρη αμςικειμέμχμ. Έμαπ δξμηςήπ δεμ
επιρςοέτει ςιμή ξύςε δηλώμεςαι χπ void.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ εγκαςάρςαρηπ/δόμηρηπ
(constructors)
class Account
{
private:
float balance;
public:
Account()
{
constructor
balance = 0;
}
void withdraw(float money)
{
if (money <= balance)
balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” << endl;
} // συμέχεια της κλάσης στημ επόμεμη διαφάμεια

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ εγκαςάρςαρηπ/δόμηρηπ
(constructors)
void deposit(float money)
{
balance += money;
}
float getBalance()
{
return balance;
}
}; // τέλος της κλάσης
main()
{
Account ac;
ac.deposit(100.0);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ:” << ac.getBalance() << endl;
ac.withdraw(70.0) ;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ:” << ac.getBalance() << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ εγκαςάρςαρηπ/δόμηρηπ
(constructors)

• Σςξ ποόγοαμμα ξοίζεςαι μία κλάρη Account, με έμα μέλξπ δεδξμέμχμ


balance, πξσ αματέοεςαι ρςξ ςοέυξμ πξρό εμόπ λξγαοιαρμξύ.

• Οοίζξμςαι επίρηπ δύξ ρσμαοςήρειπ-μέλη για ςημ αμάληφη και ςημ


καςάθερη υοημάςχμ ρςξ λξγαοιαρμό και μία ρσμάοςηρη-μέλξπ πξσ
επιρςοέτει, καςά ςημ κλήρη ςηπ, ςξ ςοέυξμ πξρό λξγαοιαρμξύ.

• Τξ ςοέυξμ πξρό λξγαοιαρμξύ αουικξπξιείςαι ρςξ 0. Ασςό


επιςσγυάμεςαι καςά ςη δημιξσογία εμόπ αμςικειμέμξσ, με ςη
ρσμάοςηρη εγκαςάρςαρηπ Account(), η ξπξία εκςελείςαι ασςόμαςα.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ απξρύμδερηπ/απξδόμηρηπ
(destructors)
class Account
{
private:
float balance;
public:
Account()
{
balance = 0;
}
~Account() // συμάρτηση αποσύμδεσης
{
cout << “The account has been deleted” << endl;
}
.
.
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ απξρύμδερηπ/απξδόμηρηπ
(destructors)

•Μία ρσμάοςηρη δόμηρηπ καλείςαι ασςόμαςα όςαμ δημιξσογείςαι


έμα αμςικείμεμξ.
•Μπξοξύμε αμςίρςξιυα μα ξοίρξσμε μία ρσμάοςηρη απξρύμδερηπ
ή απξδόμηρηπ ή απξδξμηςή (destructor), η ξπξία θα καλείςαι
ασςόμαςα όςαμ έμα αμςικείμεμξ καςαρςοέτεςαι.
•Η ρσμάοςηρη απξδόμηρηπ έυει ςξ ίδιξ όμξμα με ςημ κλάρη,
έυξμςαπ μποξρςά μία πεοιρπχμέμη ~.
•Η πιξ ρσμηθιρμέμη υοήρη ςχμ ρσμαοςήρεχμ απξδόμηρηπ είμαι
η απξδέρμεσρη ςηπ μμήμηπ πξσ είυε δερμεσςεί για έμα
αμςικείμεμξ από ςη ρσμάοςηρη δόμηρηπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ δόμηρηπ με σπεοτόοςχρη


(constructor overloading)
class Account
{
private:
float balance;
public:
Account() // συμάρτηση δόμησης χωρίς ορίσματα
{
balance = 0;
}
Account(float balance1) // συμάρτηση δόμησης με όρισμα
{
balance = balance1;
}
void withdraw(float money)
{
if (money <= balance)
balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ δόμηρηπ με σπεοτόοςχρη
(constructor overloading)
void deposit(float money)
{
balance += money;
}
float getBalance()
{
return balance;
}
};
main()
{
Account ac1, ac2(50.0), ac3(100.0);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac1:” << ac1.getBalance() << endl;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac2:” << ac2.getBalance() << endl;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac3:” << ac3.getBalance() << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ δόμηρηπ με σπεοτόοςχρη


(constructor overloading)
•Δύξ ρσμαοςήρειπ δόμηρηπ, μία με ξοίρμαςα και μία υχοίπ όοιρμα.
•Καςά ςη δήλχρη
Account ac1, ac2(50.0), ac3(100.0);
δημιξσογξύμςαι ςοία αμςικείμεμα.
•Σςξ ποώςξ γίμεςαι υοήρη ςηπ ρσμάοςηρηπ δόμηρηπ υχοίπ όοιρμα και
πξσ ξσριαρςικά δεμ κάμει ςίπξςε.
•Σςα δύξ επόμεμα αμςικείμεμα γίμεςαι υοήρη ςηπ ρσμάοςηρηπ δόμηρηπ με
ςξ όοιρμα balance1, ρςξ ξπξίξ μεςαβιβάζξμςαι ξι ςιμέπ 50.0 και 100.0,
αμςίρςξιυα, και απξδίδξμςαι ρςα ρςξιυεία δεδξμέμχμ ςχμ δύξ
αμςικειμέμχμ.
•Οι δύξ ρσμαοςήρειπ έυξσμ ςξ ίδιξ όμξμα – ςξ όμξμα ςηπ κλάρηπ – και
θεχοξύμε όςι η ρσμάοςηρη δόμηρηπ έυει σπξρςεί σπεοτόοςωρη
(overloading).
•Τξ πξια ρσμάοςηρη δόμηρηπ εκςελείςαι όςαμ δημιξσογείςαι έμα
αμςικείμεμξ, εναοςάςαι από ςξμ αοιθμό ςχμ ξοιρμάςχμ πξσ
υοηριμξπξιξύμςαι ρςξμ ξοιρμό ςξσ αμςικειμέμξσ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ-μέλη ξοιζόμεμεπ ένχ από ςημ κλάρη

•Μπξοξύμε μα διαςηοήρξσμε μέρα ρςημ κλάρη ςιπ


δηλώρειπ όλχμ ςχμ ρσμαοςήρεχμ μελώμ, αλλά μα ςιπ
ξοίρξσμε ένχ από ςημ κλάρη.

• Ασςό θα ήςαμ ίρχπ ποξςιμόςεοξ ρε μία εταομξγή πξσ


ξ αοιθμόπ ςχμ ρσμαοςήρεχμ-μελώμ είμαι μεγάλξπ, γιαςί
θα μαπ βξηθξύρε μα ελέγυξσμε καλύςεοα ςημ κλάρη. Σε
μια ςέςξια όμχπ πεοίπςχρη, θα ποέπει ρςξμ ξοιρμό ςηπ
ρσμάοςηρηπ μα αματέοξσμε και ςημ κλάρη ρςημ ξπξία
αμήκει.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ-μέλη ξοιζόμεμεπ ένχ από ςημ κλάρη

class Account
{
2 ζσναρηήζεις δόμηζης
private:
float balance;
public:
Account();
Account(float balance1);
void withdraw(float money);
void deposit(float money);
float getBalance();
Account addBalance(Account ac);
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ-μέλη ξοιζόμεμεπ ένχ από ςημ κλάρη
Account::Account()
{
balance = 0;
}
Account::Account(float balance1) // συμάρτηση δόμησης με όρισμα
{
balance = balance1;
}
void Account::withdraw(float money)
{
if (money <= balance)
balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ-μέλη ξοιζόμεμεπ ένχ από ςημ κλάρη


void Account::deposit(float money)
{
balance += money;
}
float Account::getBalance()
{
return balance;
}
Account Account::addBalance(Account ac)
{
Account temp;
temp.balance = balance + ac.balance;
return temp;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ-μέλη ξοιζόμεμεπ ένχ από ςημ κλάρη
main()
{
Account ac1(100.0), ac2(70.0), ac3;
ac3 = ac1.addBalance(ac2);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac1:” << ac1.getBalance() << endl;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac2:” << ac2.getBalance() << endl;
cout << “Σσμξλικό πξρό λξγαοιαρμώμ:” << ac3.getBalance() << endl;
}

Σε ασςόμ ςξμ ξοιρμό μίαπ ρσμάοςηρηπ παοεμβάλλεςαι ςξ όμξμα ςηπ


κλάρηπ και ςξ ρύμβξλξ ::, πξσ ξμξμάζεςαι ςελερςήπ διάκοιρηπ ή
αμαγχγήπ εμβέλειαπ (scope resolution operator), ξ ξπξίξπ παοέυει
έμαμ ςοόπξ για μα καθξοίζξσμε ρε πξια κλάρη αμήκει μία ρσμάοςηρη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμαοςήρειπ δόμηρηπ – εμαλλακςικόπ ξοιρμόπ


Εμαλλακςικόπ ςοόπξπ ξοιρμξύ ςηπ ρσμάοςηρηπ δόμηρηπ:
Account :: Account(float balance1) : balance(balance1)
{ /* εσκεμμέμα κεμό σώμα της συμάρτησης δόμησης */ }

Δηλαδή ξι ςιμέπ με ςιπ ξπξίεπ θα αουικξπξιηθξύμ ξι μεςαβληςέπ-μέλη


μπαίμξσμ ρε παοεμθέρειπ μεςά ςα ξμόμαςα ςχμ μεςαβληςώμ μελώμ,
εμώ αοιρςεοά ασςώμ ςίθεςαι ξ ποξρδιξοιρςήπ :
Εάμ ρςημ κλάρη σπάουξσμ δύξ ή πεοιρρόςεοεπ μεςαβληςέπ-μέλη
(π.υ. float balance, float interest), ξι ξπξίεπ θα λάβξσμ ςιπ αουικέπ
ςιμέπ balance1 και interest1, αμςίρςξιυα, ςόςε ξ εμαλλακςικόπ
ςοόπξπ δόμηρηπ θα έδιμε:
Account :: Account(float balance1) : balance(balance1), (interest1)
{ /* εσκεμμέμα κεμό σώμα της συμάρτησης δόμησης */ }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Σσμαοςήρειπ δόμηρηπ – εμαλλακςικόπ ξοιρμόπ
To ρώμα ςηπ ρσμάοςηρηπ δόμηρηπ μπξοεί μα πεοιέυει κώδικα
π.υ. έλεγυξ καςά πόρξμ ςξ επιςόκιξ είμαι θεςικό:

Account :: Account(float balance1) : balance(balance1),


(interest1)
{
if (interest < 0 )
{
cout << “Error!! Negative interest value\n\n”;
exit(1);
}
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Σσμξλικό παοάδειγμα κλάρηπ με έμταρη


ρςξσπ δξμηςέπ – απξδξμηςέπ:

Walter Savitch, Absolute C++, 5th ed.


pp. 286-291

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Τα δεδξμέμα ςηπ κλάρηπ BankAccount είμαι ςξ σπόλξιπξ ςξσ λξγαοιαρμξύ και ςξ
επιςόκιξ. Τξ σπόλξιπξ απεικξμίζεςαι με δύξ ακέοαιεπ μεςαβληςέπ: ςξ ακέοαιξ μέοξπ
($) και ςξ κλαρμαςικό μέοξπ (¢). Η ρσγκεκοιμέμη απεικόμιρη απξρκξπεί ρςξ μα δείνει
όςι η ερχςεοική αμαπαοάρςαρη ςηπ έμμξιαπ ςξσ κάθε δεδξμέμξσ δεμ είμαι αμαγκαίξ
μα ςασςίζεςαι με μία μόμξ μεςαβληςή. Επιπλέξμ, εάμ ςξ σπόλξιπξ πεοιγοατόςαμ από
έμαμ αοιθμό κιμηςήπ σπξδιαρςξλήπ θα απξςελξύρε μία ποξρέγγιρη ςηπ ποαγμαςικήπ
ςιμήπ και μάλιρςα με πεοιρρόςεοα ςχμ 2 δεκαδικώμ φητίχμ, γεγξμόπ πξσ θα εουόςαμ
ρε αμςίθερη με ςημ έμμξια ςξσ cent.

Η κλάρη έυει ςέρρεοιπ ιδιχςικέπ ρσμαοςήρειπ-μέλη: dollarsPart(), centsPart(), round()


και fraction(). Έυξσμ καςαρςεί ιδιχςικέπ γιαςί ξ ρκξπόπ ςηπ υοήρηπ ςξσπ είμαι ξ
ξοιρμόπ άλλχμ ρσμαοςήρεχμ-μελώμ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

W. Savitch, Absolute C++, 5th Ed.

Σηο ζσγκεκριμένο παράδειγμα οι ιδιωηικές


μεηαβληηές-μέλη και ζσναρηήζεις-μέλη
δηλώνονηαι ζηο ηέλος ηης κλάζης.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

W. Savitch, Absolute
C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

W. Savitch, Absolute C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


W. Savitch, Absolute
C++, 5th Ed.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Αμςικείμεμα χπ ξοίρμαςα ρσμαοςήρεχμ


Σςξ ποόγοαμμα πξσ ακξλξσθεί ξοίζεςαι μία ρσμάοςηρη-μέλξπ addBalance(), η ξπξία
έυει χπ ρςόυξ μα ποξρθέρει ςα πξρά δύξ διατξοεςικώμ λξγαοιαρμώμ.
#include <iostream.h>
class Account
{
private:
float balance;
public:
Account() // συμάρτηση δόμησης ορίσματα
{
balance = 0;
}
Account(float balance1) // συμάρτηση δόμησης με όρισμα
{
balance = balance1;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


void withdraw(float money)
{
if (money <= balance)
balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” << endl;
}
void deposit(float money)
{
balance += money;
}
float getBalance()
{
return balance;
}
void addBalance(Account x, Account y)
{
balance = x.balance + y.balance;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

main()
{
Account ac1(100.0), ac2(70.0), ac3;

ac3.addBalance(ac1, ac2);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac1:” <<ac1.getBalance() << endl;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac2:” << ac2.getBalance() << endl;
cout << “Σσμξλικό πξρό λξγαοιαρμώμ:” << ac3.getBalance() << endl;
}
Η κλήρη ρσμάοςηρηπ μέρα ρςη main()
ac3.addBalance(ac1, ac2);
μεςαβιβάζει ςα αμςικείμεμα ac1 και ac2 ρςιπ παοαμέςοξσπ ςηπ ρσμάοςηρηπ x και y αμςίρςξιυα.
Σςξμ κώδικα ςηπ ρσμάοςηρηπ γίμεςαι αματξοά ρςα δεδξμέμα ςχμ αμςικειμέμχμ x.balance και
y.balance. Ασςό είμαι ετικςό γιαςί, αμ και ςα δεδξμέμα είμαι ιδιχςικά, εμςξύςξιπ είμαι
ποξρπελάριμα καθώπ η ρσμάοςηρη είμαι μέλξπ ςηπ κλάρηπ.
Τα δεδξμέμα ποξρςίθεμςαι και ςξ απξςέλερμα απξδίδεςαι ρςξ δεδξμέμξ ςξσ αμςικειμέμξσ ςξ
ξπξίξ καλεί ςη ρσμάοςηρη-μέλξπ, ςξ ξπξίξ είμαι ςξ ac3.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Επιρςοξτή αμςικειμέμχμ από ρσμαοςήρειπ
Σςξ ποξηγξύμεμξ παοάδειγμα είδαμε πώπ αμςικείμεμα μεςαβιβάζξμςαι χπ ξοίρμαςα ρε ρσμαοςήρειπ. Σςξ
παοάδειγμα πξσ ακξλξσθεί θα δξύμε μία ρσμάοςηρη πξσ επιρςοέτει έμα αμςικείμεμξ.

Account addBalance(Account ac)


{
Account temp;
temp.balance = balance + ac.balance;
return temp;
}
main()
{
Account ac1(100.0), ac2(70.0), ac3;
ac3 = ac1.addBalance(ac2);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac1:” << ac1.getBalance() << endl;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac2:” << ac2.getBalance() << endl;
cout << “Σσμξλικό πξρό λξγαοιαρμώμ:” << ac3.getBalance() << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Επιρςοξτή αμςικειμέμχμ από ρσμαοςήρειπ

Τξ παοαπάμχ παοάδειγμα πεςσυαίμει ό,ςι ακοιβώπ και ςξ


ποξηγξύμεμξ, δηλαδή ποξρθέςει δύξ λξγαοιαρμξύπ και
ςξ ρσμξλικό πξρό απξδίδεςαι ρε έμα ςοίςξ αμςικείμεμξ,
μόμξ πξσ υοηριμξπξιεί μία διατξοεςική ποξρέγγιρη.

Σςη ρσμάοςηρη addBalance() μεςαβιβάζεςαι μόμξ ςξ έμα


αμςικείμεμξ χπ όοιρμα, π.υ ςξ ac2 μεςαβιβάζεςαι ρςημ
παοάμεςοξ ac.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Έμςανη κλάρηπ ρςξσπ ςύπξσπ δεδξμέμχμ

Μία κλάρη είμαι έμαπ πλήοηπ ςύπξπ δεδξμέμχμ, όπχπ


π.υ. ξι ςύπξι int και double, με διεσοσμέμεπ βέβαια
λειςξσογίεπ. Mπξοξύμε μα έυξσμε:
•Μεςαβληςέπ ςύπξσ κλάρηπ (αμςικείμεμα)
•Παοαμέςοξσπ ρσμαοςήρεωμ ςύπξσ κλάρηπ
•Επιρςοετόμεμεπ ςιμέπ ρσμαοςήρεωμ ςύπξσ κλάρηπ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ενότητα 3

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Περιεχόμενα ενότητασ
1. Υπερφόρτωση τελεστώμ (operator overloading)
2. Υπερθόρηωζη αριθμηηικών ηελεζηών
3. Υπερθόρηωζη ηελεζηών ζύγκριζης
4. Υπερθόρηωζη ηελεζηών με τρήζη ζσναρηήζεων-μελών
5. Yπερθόρηωζη μοναδιαίων ηελεζηών
6. Yπερθόρηωζη ηοσ ηελεζηή ανάθεζης
7. Yπερθόρηωζη ηοσ ηελεζηή κλήζης ζσνάρηηζης
8. Πίνακες
9. Πίνακες ζε ζσναρηήζεις
10. Πίνακες ως δεδομένα κλάζεων
11. Πίνακες ανηικειμένων

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη ςελερςώμ (operator overloading)


Η σπεοτόοςχρη ςελερςώμ είμαι έμα από ςα πιξ
εμδιατέοξμςα υαοακςηοιρςικά ςξσ αμςικειμεμξρςοατξύπ
ποξγοαμμαςιρμξύ.
Αματέοεςαι ρςημ ποόρθεςη υοήρη ςχμ ρσμηθιρμέμχμ
ςελερςώμ, όπχπ π.υ. +, -, *, >, <, ==, ρε ςύπξσπ δεδξμέμχμ
ξοιζόμεμξσπ από ςξμ υοήρςη.
Έχπ ςώοα ποξςάρειπ όπχπ
a=b+c
έυξσμε δει μα υοηριμξπξιξύμςαι μόμξ ρε βαρικξύπ ςύπξσπ
δεδξμέμχμ. Με ςημ σπεοτόοςχρη ςελερςώμ θα δξύμε πώπ
μπξοξύμε μα εκςελέρξσμε ςέςξιεπ ποξςάρειπ, όςαμ ςα a, b
και c είμαι αμςικείμεμα μίαπ κλάρηπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη αοιθμηςικώμ ςελερςώμ

Σε ποξηγξύμεμξ παοάδειγμα παοξσριάρθηκε ςοόπξπ με ςξμ


ξπξίξ δύξ αμςικείμεμα ςηπ κλάρηπ Account μπξοξύμ μα
ποξρςεθξύμ, υοηριμξπξιώμςαπ μία ρσμάοςηρη-μέλξπ:
ac3 = ac1.addBalance(ac2);
Εάμ υοηριμξπξιηθεί ξ ςελερςήπ + με σπεοτόοςχρη, ςόςε
μπξοξύμε μα έυξσμε ςημ ενήπ ποόςαρη:
ac3 = ac1 + ac2;

Σςξ ποόγοαμμα πξσ ακξλξσθεί σλξπξιείςαι ασςή η


πεοίπςχρη:

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη αοιθμηςικώμ ςελερςώμ


class Account
{
private:
float balance;
public:
Account()
{
balance = 0;
}
Account(float balance1)
{
balance = balance1;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη αοιθμηςικώμ ςελερςώμ
void withdraw(float money)
{
if (money <= balance) balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” <<
endl;
}
void deposit(float money)
{
balance += money;
}
float getBalance()
{
return balance;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη αοιθμηςικώμ ςελερςώμ


Account operator + (Account ac)
{
Account temp;
temp.balance = balance + ac.balance;
return temp;
}
};
main()
{
Account ac1(100.0), ac2(70.0), ac3;
ac3 = ac1 + ac2;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac1:” << ac1.getBalance() << endl;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ ac2:” << ac2.getBalance() << endl;
cout << “Σσμξλικό πξρό λξγαοιαρμώμ:” << ac3.getBalance() << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη αοιθμηςικώμ ςελερςώμ
Για μα «αμαγκάρξσμε» ςξμ ςελερςή + μα εμεογήρει πάμχ ρε έμα αμςικείμεμξ,
υοηριμξπξιξύμε ςη δερμεσμέμη λένη operator. Σσγκεκοιμέμα, γοάτξσμε μία
ρσμάοςηρη όπξσ ξ ςύπξπ επιρςοετόμεμηπ ςιμήπ μπαίμει ποώςξπ,
ακξλξσθξύμεμξπ από ςη δερμεσμέμη λένη operator και αμέρωπ μεςά ςξμ ίδιξ
ςξμ ςελερςή. Τέλξπ, μέρα ρε παοεμθέρειπ γοάτξσμε ςη λίρςα ςχμ ξοιρμάςχμ.
Όςαμ ρςημ καλξύρα ρσμάοςηρη εκςελείςαι η ποόςαρη:
ac3 = ac1 + ac2;
ςόςε γίμεςαι σπεοτόοςχρη ςξσ ςελερςή + (επειδή ςα ac1 και ac2 έυξσμ
ξοιρθεί χπ αμςικείμεμα), ποξρςίθεμςαι ςα αμςικείμεμα ac1 και ac2 και ςξ
απξςέλερμα απξδίδεςαι ρςξ αμςικείμεμξ ac3.
Θα ποέπει μα διεσκοιμιρθεί όςι η ρσμάοςηρη υοηριμξπξιεί χπ όοιρμα ςξ
αμςικείμεμξ πξσ βοίρκεςαι δενιά ςξσ ςελερςή (π.υ. ςξ ac2). Ακόμα, η
ρσμάοςηρη είμαι μέλξπ ρςξ αμςικείμεμξ πξσ βοίρκεςαι αοιρςεοά ςξσ ςελερςή
(π.υ. ρςξ ac1) και έςρι η αματξοά ρςα δεδξμέμα ασςξύ ςξσ αμςικειμέμξσ είμαι
άμερη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη ςελερςώμ ρύγκοιρηπ


Με παοόμξιξ ςοόπξ μπξοξύμε μα σλξπξιήρξσμε ςημ σπεοτόοςχρη ςελερςώμ
ρύγκοιρηπ.
Σςξ επόμεμξ ποόγοαμμα θα υοηριμξπξιήρξσμε ςξμ ςελερςή > (μεγαλύςεοξ
από) με σπεοτόοςχρη, ρςημ κλάρη Account, για μα μπξοξύμε μα ρσγκοίμξσμε
δύξ λξγαοιαρμξύπ:

class Account
{
private:
float balance;
public:
Account()
{
balance = 0;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη ςελερςώμ ρύγκοιρηπ
Account(float balance1)
{
balance = balance1;
}
void withdraw(float money)
{
if (money <= balance) balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ
ςοέυξμ!” << endl;
}
void deposit(float money)
{
balance += money;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη ςελερςώμ ρύγκοιρηπ


float getBalance()
{
return balance;
}

bool operator > (Account ac)


{
if (balance > ac.balance) return true;
else return false;
}
}; // τέλος της κλάσης

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη ςελερςώμ ρύγκοιρηπ
main()
{
Account ac1(100.0), ac2(70.0);

if (ac1 > ac2)


cout << “Τξ πξρό ςξσ λξγαοιαρμξύ ac1 είμαι μεγαλύςεοξ.”
<< endl;
else
cout << “Τξ πξρό ςξσ ac2 είμαι μεγαλύςεοξ ή είμαι ίρξι.”
<< endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Τελερςέπ πξσ δεμ επιδέυξμςαι σπεοτόοςχρη


• Οι ςελερςέπ
:: (διάκοιρηπ εμβέλειαπ)
. (ποόρβαρηπ ρε μέλξπ)
.* (ποόρβαρηπ ρε μέλξπ μέρχ δείκςη ρε μέλξπ)
?: (σπξθεςικόπ ςελερςήπ)
Δεμ μπξοξύμ μα σπεοτξοςχθξύμ.

• Δεμ μπξοξύμ μα δημιξσογηθξύμ μέξι ςελερςέπ ςηπ


μξοτήπ ** ή &|.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
Θεχοξύμε ςημ ακόλξσθη κλάρη:
class rectangle {
private:
float side_a, side_b;
public:
int color;
rectangle(float a, float b);
rectangle();
void set_sides(float a, float b);
float area();
void show();
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
void rectangle :: set_sides(float a, float b)
{
side_a = a; side_b = b;
}
float rectangle :: area()
{
return side_a * side_b;
}
void rectangle :: show()
{
cout << …. << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
rectangle :: rectangle(float a, float b)
{
side_a = a;
side_b = b;
color = 0;
}
bool rectangle :: operator > (rectangle op2)
{
if (this -> area() > op2.area()) return true;
else return false;
} Εννοείηαι:
(area() > op2.area())

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ

Καςά ρσμέπεια, ςξ ρυεςικό ςμήμα κώδικα ςηπ main είμαι:


rectangle rec1(10,2), rec2(5,7);
if (rec2 > rec1)
cout << “rec2 > rec1” << endl;

Aποηέλεζμα:
rec2 > rec1

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Yπεοτόοςχρη μξμαδιαίχμ ςελερςώμ

Σε πεοίπςχρη πξσ σπάουει μεςαθεμαςική και ποξθεμαςική


ρημειξγοατία (postfix/prefix) θα ποέπει μα έυξσμε δύξ εκδξυέπ,
μία για κάθε ρημειξγοατία.

(α) Ποξθεμαςική ρημειξγοατία:


rectangle rectangle :: operator ++()
{
this -> side_a ++; ή side_a ++;
this -> side_b ++; ή side_b ++;
return *this; Δεν ςπάπσει παπάμεηπορ.
}
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Yπεοτόοςχρη μξμαδιαίχμ ςελερςώμ

(β) Σςη μεςαθεμαςική ρημειξγοατία σπάουει παοάμεςοξπ πξσ δε υοηριμξπξιείςαι, γι‟


ασςό και δεμ αματέοεςαι ςξ όμξμά ςηπ:
rectangle rectangle :: operator ++(int)
{
rectangle temp = *this;
this -> side_a ++;
this -> side_b ++;
return temp;
}
Όπχπ διαπιρςώμεςαι, ξι ςοέυξσρεπ ςιμέπ ςξσ αμςικειμέμξσ αμςιγοάτξμςαι ρςξ ςξπικό
αμςικείμεμξ temp, ςξ ξπξίξ θα επιρςοατεί ρςημ καλξύρα ρσμάοςηρη, έςρι ώρςε ξι
ασνήρειπ μα μημ επηοεάρξσμ ςημ παοάρςαρη ρςημ ξπξία εμπλέκεςαι ςξ αμςικείμεμξ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Yπεοτόοςχρη μξμαδιαίχμ ςελερςώμ

Παοάδειγμα (ςμήμα ςηπ main):


rectangle rec1(10,2), rec2(5,7), rec3;
cout << “rec1 = ”;
rec1.show();
rec1++;
Aποηελέζμαηα:
cout << “rec1 = ”; rec1 = 10x2, color = 0
rec1.show(); rec1 = 11x3, color = 0
rec3 = rec2 ++; rec3 = 5x7, color = 0
cout << “rec3 = ”; rec2 = 6x8, color = 0
rec3.show();
cout << “rec2 = ”;
rec2.show(); Ανηιγπάθονηαι οι «παλιέρ» διαζηάζειρ ηος rec2, οι
οποίερ ακολούθωρ αςξάνονηαι καηά 1.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Yπεοτόοςχρη ςξσ ςελερςή αμάθερηπ

Όςαμ υοηριμξπξιείςαι η δσμαμική διαυείοιρη μμήμηπ ποξςιμάςαι η


σπεοτόοςχρη.
Παοάδειγμα εταομξγήπ: Αμςιγοατή μέοξσπ ςχμ μεςαβληςώμ-μελώμ
και όυι ςξσ ρσμόλξσ, π.υ. Αμςιγοατή μόμξ ςχμ πλεσοώμ και όυι ςξσ
υοώμαςξπ:
rectangle rectangle :: operator =(rectangle op2)
{
this -> side_a = op2.side_a;
this -> side_b = op2.side_b;
return *this;
}
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Yπεοτόοςχρη ςξσ ςελερςή αμάθερηπ
Παοάδειγμα (ςμήμα ςηπ main):
rectangle rec1(10,2), rec2(5,7);
rec1.color = 1;
rec2.color = 2;
cout << “rec1 = ”;
rec1.show();
rec1 = rec2;
Aποηελέζμαηα:
cout << “rec1 = ”; rec1 = 10x2, color = 1
rec1.show(); rec1 = 5x7, color = 1
Δηλαδή ηο χπώμα δεν άλλαξε.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Yπεοτόοςχρη ςξσ ςελερςή κλήρηπ ρσμάοςηρηπ


„Οςαμ γίμεςαι αματξοά ρςα αμςικείμεμα μίαπ κλάρηπ ρε μξοτή ρσμαοςήρεχμ π.υ.
rec(4,6), ςα ξοίρμαςα πξσ ακξλξσθξύμ μεςαβιβάζξμςαι ρςη ρσμάοςηρη
σπεοτόοςχρηπ ςξσ ςελερςή ().
Παοάδειγμα:
rectangle rectangle :: operator () (float a, float b)
{
this -> side_a = a;
this -> side_b = b;
return *this;
}

Οσριαρςικά δοα χπ ρσμάοςηρη αμάθερηπ ςιμήπ ή ςοξπξπξίηρηπ ςιμήπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Yπεοτόοςχρη ςξσ ςελερςή κλήρηπ ρσμάοςηρηπ
Eάμ ξοίρξσμε έμα μόμξμ όοιρμα, μπξοξύμε π.υ. μα κλιμακξπξιήρξσμε:
rectangle rectangle :: operator () (float scale) {
this -> side_a = side_a * scale;;
this -> side_b = side_b * scale;
return *this;
}
Aποηελέζμαηα:
Παοάδειγμα (ςμήμα ςηπ main):
rec1 = 10x2, color = 1
rectangle rec1(10,2);
rec1.color = 1; rec1 = 5x9, color = 1
cout << “rec1 = ”; rec1.show(); rec1 = 15x27, color = 1
rec1(5,9);
cout << “rec1 = ”; rec1.show();
rec1(3);
cout << “rec1 = ”; rec1.show();

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
Οι τίλιεπ (friend) ρσμαοςήρειπ δηλώμξμςαι ρςξ public ςμήμα μίαπ κλάρηπ με ςξ ποόθεμα
friend, αλλά ξοίζξμςαι όπχπ ξι καμξμικέπ ρσμαοςήρειπ εκςόπ ςηπ κλάρηπ, υχοίπ ςξ
class_name ::, και ποξρπελαύμξσμ ςα ιδιχςικά μέλη ςχμ αμςικειμέμχμ ςηπ κλάρηπ.
Καςά ρσμέπεια δεμ απξςελξύμ ρσμαοςήρειπ-μέλη και ξ δείκςηπ this δε μεςαβιβάζεςαι.
Παοάδειγμα τίλιαπ ρσμάοςηρηπ:
class rectangle
{
private:
float side_a, side_b;
public:
rectangle(float a, float b);
rectangle();

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
float area();
void set_sides(float a, float b);
friend void to_zero(rectangle &rec);
}; // τέλος της κλάσης rectangle
Δε ρσμδέεςαι με
void to_zero(rectangle &rec) { ςημ κλάρη μέρω ::
rec.side_a = 0;
rec_side_b = 0;
} Aποηελέζμαηα:
main {
Area of rec1 (prior) = 56
rectangle rec1;
rec1.set_sides(8,7); Area of rec1 (afterwards) = 0
cout << “Area of rec1 (prior) = ” << rec1.area() << endl;
to_zero(rec1);
cout << “Area of rec1 (afterwards) = ” << rec1.area() << endl;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ
Οι πίμακεπ (ρσλλξγέπ ρςξιυείχμ ςξσ ίδιξσ ςύπξσ δεδξμέμχμ) καςαςάρρξμςαι
ρςιπ ρςαςικέπ δξμέπ δεδξμέμχμ.

Με ςξμ όοξ ρςαςική δξμή δεδξμέμωμ εμμξείςαι όςι ςξ ακοιβέπ μέγεθξπ ςηπ
απαιςξύμεμηπ κύοιαπ μμήμηπ καθξοίζεςαι καςά ςη ρςιγμή ςξσ
ποξγοαμμαςιρμξύ ςξσπ, επξμέμχπ καςά ςη ρςιγμή ςηπ μεςάτοαρηπ ςξσ
ποξγοάμμαςξπ και όυι καςά ςη ρςιγμή ςηπ εκςέλερήπ ςξσ.

Έμα άλλξ υαοακςηοιρςικό ςχμ πιμάκχμ είμαι όςι ςα ρςξιυεία ςξσπ


απξθηκεύξμςαι ρε ρσμευόμεμεπ θέρειπ μμήμηπ.

Η δήλχρη ςχμ ρςξιυείχμ εμόπ πίμακα και η μέθξδξπ αματξοάπ ςξσπ


εναοςάςαι από ςη ρσγκεκοιμέμη γλώρρα σφηλξύ επιπέδξσ πξσ
υοηριμξπξιείςαι. Όμχπ γεμικά, η αματξοά ρςα ρςξιυεία εμόπ πίμακα γίμεςαι
με ςη υοήρη ςξσ ρσμβξλικξύ ξμόμαςξπ ςξσ πίμακα ακξλξσθξύμεμξσ από ςημ
ςιμή εμόπ ή πεοιρρξςέοχμ αοιθμξδεικςώμ (indices) ρε παοέμθερη ή αγκύλη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ

Έμαπ πίμακαπ μπξοεί μα είμαι μξμξδιάρςαςξπ, διρδιάρςαςξπ,


ςοιρδιάρςαςξπ και γεμικά μ-διάρςαςξπ πίμακαπ.

Σςη C++ επιςοέπεςαι ξ ξοιρμόπ πιμάκχμ ξπξιαρδήπξςε


διάρςαρηπ, αλλά πέοαμ ςηπ δεύςεοηπ, η υοήρη ςξσπ εμέυει
ςέςξια πξικιλία ποξβλημάςχμ ώρςε μα είμαι απξςοεπςική. Για
ςξ λόγξ ασςό, κσοίχπ θα αρυξληθξύμε με μξμξδιάρςαςξσπ
(one-dimensional) και διρδιάρςαςξσπ (two-dimensional)
πίμακεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ
Οοιρμόπ μξμξδιάρςαςξσ Οοιρμόπ διρδιάρςαςξσ
πίμακα ακεοαίωμ: πίμακα ακεοαίωμ:

#define N 10 #define M 8
#define N 10
main()
{ main()
int p[N]; {
. int p[M][N];
. .
. .
. .
} .
}
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Πίμακεπ ρε ρσμαοςήρειπ

•Σςαςικξί ςξπικξί πίμακεπ


–Διαςηοξύμ ςιπ ςιμέπ ςξσπ μεςανύ ςχμ κλήρεχμ μιαπ
ρσμάοςηρηπ
–Οι ρςαςικξί πίμακεπ αουικξπξιξύμςαι με μηδέμ.
static int array[3];
•Ασςόμαςξι ςξπικξί πίμακεπ
–Δημιξσογξύμςαι (και καςαρςοέτξμςαι) με κάθε κλήρη ςηπ
ρσμάοςηρηπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ ρε ρσμαοςήρειπ
Deitel & Deitel, C++
How to Program

1 // ΠΑράδειγμα ζηαηικών και μη πινάκων


2 // Οι ζηαηικοί πίνακες αρτικοποιούνηαι με μηδέν
3 #include <iostream>
4
5 using namespace std;
6 using std::endl;
7
8 void staticArrayInit( void ); // δήλωζη ζσνάρηηζης
9 void automaticArrayInit( void ); // δήλωζη ζσνάρηηζης
10
11 int main()
12 {
13 cout << "First call to each function:\n";
14 staticArrayInit();
15 automaticArrayInit();
16
17 cout << "\n\nSecond call to each function:\n";
18 staticArrayInit();
19 automaticArrayInit();
20 cout << endl;
21
22 return 0;
23
24 }
25

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ ρε ρσμαοςήρειπ
Deitel & Deitel, C++
How to Program

26 Σηαηικός πίνακας, αρτικοποι-


27 void staticArrayInit( void )
είηαι με μηδενικά ζηην πρώηη
28 {
29
κλήζη ηης ζσνάρηηζης.
30 static int array1[ 3 ];
31
32 cout << "\nValues on entering staticArrayInit:\n";
33
34
35 for ( int i = 0; i < 3; i++ )
36 cout << "array1[" << i << "] = " << array1[ i ] << " ";
37
Τα δεδομένα μεηαβλήθηκαν και οι
38 cout << "\nValues on exiting staticArrayInit:\n";
39
μεηαβολές θα διαηηρηθούν και
40 μεηά ηο πέρας ηης ζσνάρηηζης.
41 for ( int j = 0; j < 3; j++ )
42 cout << "array1[" << j << "] = "
43 << ( array1[ j ] += 5 ) << " ";
44
45 }
46

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ ρε ρσμαοςήρειπ
Deitel & Deitel, C++
How to Program

47
48 void automaticArrayInit( void ) Ασηόμαηος πίνακας, δημιοσρ-
49 { γείηαι εκ νέοσ με κάθε κλήζη
50 ζσνάρηηζης.
51 int array2[ 3 ] = { 1, 2, 3 };
52
53 cout << "\n\nValues on entering automaticArrayInit:\n";
54
55
56 for ( int i = 0; i < 3; i++ )
57 cout << "array2[" << i << "] = " << array2[ i ] << " ";
58
59 Αν και ο πίνακας
cout << "\nValues on exiting automaticArrayInit:\n"; μεηαβλή-
60 θηκε, θα καηαζηραθεί με ηο
61 πέρας ηης ζσνάρηηζης και οι
62 for ( int j = 0; j < 3; j++ ) μεηαβολές θα ταθούν.
63 cout << "array2[" << j << "] = "
64 << ( array2[ j ] += 5 ) << " ";
65
66 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ ρε ρσμαοςήρειπ
Deitel & Deitel, C++
How to Program

First call to each function:

Values on entering staticArrayInit:


array1[0] = 0 array1[1] = 0 array1[2] = 0
Values on exiting staticArrayInit:
array1[0] = 5 array1[1] = 5 array1[2] = 5

Values on entering automaticArrayInit:


array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6 array2[1] = 7 array2[2] = 8

Second call to each function:

Values on entering staticArrayInit:


array1[0] = 5 array1[1] = 5 array1[2] = 5
Values on exiting staticArrayInit:
array1[0] = 10 array1[1] = 10 array1[2] = 10

Values on entering automaticArrayInit:


array2[0] = 1 array2[1] = 2 array2[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6 array2[1] = 7 array2[2] = 8

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ χπ δεδξμέμα κλάρεχμ


Οι πίμακεπ μπξοξύμ μα υοηριμξπξιηθξύμ χπ ρςξιυεία
δεδξμέμχμ ρςιπ κλάρειπ.
Απ ενεςάρξσμε έμα παοάδειγμα, όπξσ ξοίζεςαι μία κλάρη
με ςξ όμξμα Student και δεδξμέμα ςξμ αοιθμό μηςοώξσ
εμόπ ρπξσδαρςή και έμαμ πίμακα, όπξσ απξθηκεύξμςαι 6
βαθμξλξγίεπ ςξσ για 6 αμςίρςξιυα μαθήμαςα.

#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 6;
theory_3_matrices_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ χπ δεδξμέμα κλάρεχμ
class Student
{
private:
int am;
float vath[N];
public:
Student();
void readData();
float getAvg();
float getMin();
float getMax();
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ χπ δεδξμέμα κλάρεχμ


main()
{
Student s1;
s1.readData();
cout << "\tGPA (Grade Point Average) = “
<< fixed << setprecision(2) << s1.getAvg() << endl;
cout << "\tMaximum grade = “
<< setprecision(2) << s1.getMax() << endl;
cout << "\tMinimum grade = “
<< setprecision(2) << s1.getMin() << endl;

cout << endl << endl;


system("PAUSE");
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ χπ δεδξμέμα κλάρεχμ
Student :: Student()
{
int i;
am = 0;
for (i=0; i<N; i++) vath[i] = 0;
}
void Student :: readData()
{
int i;
cout << "Give A.M:"; cin >> am;
for (i=0; i<N; i++)
{
cout << "\tGrade for course " << i+1 << ":";
cin >> vath[i]; cout << endl;
}
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ χπ δεδξμέμα κλάρεχμ


float Student :: getAvg()
{
int i;
float sum = 0, avg;
for (i=0; i<N; i++) sum += vath[i];
avg = sum/N;
return avg;
}
float Student :: getMin()
{
int i;
float minim;
minim = vath[0];
for (i=1; i<N; i++) if (vath[i] < minim) minim = vath[i];
return minim;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ χπ δεδξμέμα κλάρεχμ
float Student :: getMax()
{
int i;
float maxim;
maxim = vath[0];
for (i=1; i<N; i++)
if (vath[i] > maxim) maxim = vath[i];
return maxim;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ αμςικειμέμχμ
Όπχπ έμα αμςικείμεμξ μπξοεί μα πεοιέυει έμαμ πίμακα, μπξοεί μα ιρυύει
και ςξ αμςίρςοξτξ, δηλαδή μα έυξσμε έμαμ πίμακα πξσ μα πεοιέυει
αμςικείμεμα.

#include <cstdlib>
#include <iostream>

using namespace std;

const int N = 4;
class Employee
{
private:
int rn;
char name[20];
float salary; theory_3_matrices_2.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ αμςικειμέμχμ
public:
void readData();
void printData();
int getRN();
}; // τέλος της κλάσης

main()
{
Employee emp[N];
int i, armit;
bool found = false;
cout << "Provide details for " << N << " employees:" << endl;
for (i=0; i<N; i++)
{
cout << endl << "\tEmployee " << i+1 << ":" << endl;
emp[i].readData();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ αμςικειμέμχμ
cout << "Search an employee by R.N.: ";
cin >> armit;
i = 0;
found = false;
while (i<N && found == false)
{
if (emp[i].getRN() == armit) found = true;
else i++;
}
if (found == true) emp[i].printData();
else cout << "Unidentified N.R.!!" << endl;

cout << endl << endl;


system("PAUSE");
} // τέλος της main

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ αμςικειμέμχμ

void Employee :: readData()


{
cout << "Employee's Record Number: ";
cin >> rn;
cout << endl << "Employee's name: ";
cin >> name;
cout << endl << "Employee's salary: ";
cin >> salary;
}
void Employee :: printData()
{
cout << "\tRecord Number: " << rn << endl;
cout << "\tName: " << name << endl;
cout << "\tSalary: " << salary << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

int Employee :: getRN()


{
return rn;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ αμςικειμέμχμ

Σςξ ποξηγξύμεμξ ποόγοαμμα ξοίζεςαι έμαπ πίμακαπ


αμςικειμέμχμ emp ςύπξσ Employee.

Καςόπιμ, με μία δξμή επαμάληφηπ for πληκςοξλξγξύμςαι


πληοξτξοίεπ για κάθε έμα από ςα 4 αμςικείμεμα ςξσ πίμακα,
με ςημ κλήρη ςηπ ρσμάοςηρηπ readData().

Τέλξπ, πληκςοξλξγείςαι έμαπ ςσυαίξπ αοιθμόπ μηςοώξσ και


αμαζηςείςαι ρςξμ πίμακα αμςικειμέμχμ. Εάμ σπάουει,
εμταμίζξμςαι ξι πληοξτξοίεπ για ςξμ ρσγκεκοιμέμξ
εογαζόμεμξ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ενότητα 4

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Περιεχόμενα ενότητασ
1. Μετατροπή τύπωμ
2. Μεηαηποπέρ μεηαξύ ανηικειμένων
και βαζικών ηύπων
3. Μεηαηποπέρ μεηαξύ ανηικειμένων
διαθοπεηικών κλάζεων

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπή ςύπχμ
Γμχοίζξσμε από ποιμ όςι ποξςάρειπ όπχπ
x = y;
όπξσ x και y είμαι π.υ. ακέοαιξσ ςύπξσ, απξδίδξσμ ςημ ςιμή μίαπ μεςαβληςήπ
ρε μία άλλη.
Παοόμξια, η ποόςαρη
a1 = a2 + a3
όπξσ ςα a1, a2, a3 είμαι αμςικείμεμα, απξδίδει ςημ ςιμή εμόπ αμςικειμέμξσ ρε
έμα άλλξ.
Έςρι, ξι απξδόρειπ ςιμώμ μεςανύ μεςαβληςώμ βαρικώμ ςύπχμ και ςύπχμ
ξοιρμέμχμ από ςξμ υοήρςη, αμαλαμβάμξμςαι από ςξ μεςαγλχςςιρςή, αοκεί μα
είμαι ξ ίδιξπ ςύπξπ δεδξμέμχμ και από ςιπ δύξ πλεσοέπ ςξσ ςελερςή αμάθερηπ.
Όςαμ ξι μεςαβληςέπ είμαι διατξοεςικξύ ςύπξσ, ςόςε, εάμ είμαι και ξι δύξ
βαρικξύ ςύπξσ, η μεςαςοξπή γίμεςαι ασςόμαςα από ςξ μεςαγλχςςιρςή
(casting). Σε διατξοεςική πεοίπςχρη ποέπει εμείπ μα ξοίρξσμε ςη λειςξσογία,
όπχπ θα αμαλσθεί ρςιπ επόμεμεπ διατάμειεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
και βαρικώμ ςύπχμ
#include <cstdlib>
#include <iostream>

using namespace std;


const float MTF = 3.28033;
class EngDist
{
private:
int feet;
int inches;
public:
operator float() // συμάρτηση μετατροπής από τύπο οριζόμεμο
{ // από τομ χρήστη σε βασικό τύπο
float meters;
meters = (feet + inches/12.0) / MTF;
return meters;
}

theory_4_casting_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


και βαρικώμ ςύπχμ
EngDist();
EngDist(int feet1, float inches1);
EngDist(float meters);
void readDist(); Εθαρμογή ηων 3
void printDist(); διαθορεηικών δομηηών
}; // τέλος της κλάσης

main()
{
const int ft=6;
const int in=10;
EngDist d1, d2(ft,in), d3(1.8295);
float metr;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
και βαρικώμ ςύπχμ
cout << endl << "\tGive a height in meters for casting d1: ";
cin >> metr;
d1 = metr; // χρήση συμάρτησης δόμησης για μετατροπή από
cout << "\td1 = "; // μέτρα σε EngDist
d1.printDist();

metr = d2; // χρήση συμάρτησης μετατροπής για μετατροπή από


// EngDist σε μέτρα
cout << endl << "\tmetr (from casting d2)= " << metr << " meters." <<
endl;
cout << endl << "\td3 (directly from constructor) = "; // μέτρα σε
// EngDist
d3.printDist();
} // ηέλορ ηηρ main

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


και βαρικώμ ςύπχμ

Engdist :: EngDist(float meters) // συμάρτηση δόμησης για μετατροπή


{ // από βασικό τύπο σε τύπο οριζόμεμο από τομ χρήστη
float ft;
ft = MTF * meters;
feet = int(ft);
inches = 12 * (ft - feet);
}
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
και βαρικώμ ςύπχμ

EngDist :: EngDist()
{
feet = 0;
inches = 0;
}
EngDist :: EngDist(int feet1, int inches1)
{
feet = feet1;
inches = inches1;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


και βαρικώμ ςύπχμ

void EngDist :: readDist()


{
cout << endl << "\tGive feet:";
cin >> feet;
cout << endl << "\tGive inches:";
cin >> inches;
}
void EngDist :: printDist()
{
cout << feet << " feet, " << inches << " inches." << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
και βαρικώμ ςύπχμ
Σσμξφίζξμςαπ, για μα μεςαςοέφξσμε έμα βαρικό ςύπξ fundamental_type –
όπχπ π.υ. float- ρε ςύπξ ξοιζόμεμξ από ςξμ υοήρςη – π.υ. EngDist-
υοηριμξπξιξύμε μία ρσμάοςηρη δόμηρηπ με όοιρμα ςξσ βαρικξύ ςύπξσ
fundamental_type: EngDist(float meters).
Ασςή η ρσμάοςηρη εκςελείςαι όςαμ εκςελείςαι η ποόςαρη:
d1 = 1.95;
Όςαμ μεςαςοέπξσμε έμα ςύπξ ξοιζόμεμξ από ςξ υοήρςη ρε βαρικό,
υοηριμξπξιξύμε ςη ρσμάοςηρη μεςαςοξπήπ: operator float().
Η ρσμάοςηρη καλείςαι όςαμ εκςελείςαι η ποόςαρη: metr = d2;
Μόλιπ ξ μεςαγλχςςιρςήπ αμςιλητθεί όςι ποξρπαθξύμε μα μεςαςοέφξσμε έμαμ
ςύπξ ξοιζόμεμξ από ςξ υοήρςη ρε έμα βαρικό ςύπξ, αμαζηςά έμαμ ςελερςή με
σπεοτόοςχρη =. Όςαμ δε βοει κάπξιξμ ρσμευίζει ςημ αμαζήςηρη, βοίρκει ςη
ρσμάοςηρη μεςαςοξπήπ και ςη υοηριμξπξιεί.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


διατξοεςικώμ κλάρεχμ
• Όςαμ έυξσμε μα εκςελέρξσμε μεςαςοξπή μεςανύ δύξ αμςικειμέμχμ πξσ
ποξέουξμςαι από διατξοεςικέπ κλάρειπ, ακξλξσθξύμε μία παοόμξια
διαδικαρία. Χοηριμξπξιξύμε μία ρσμάοςηρη δόμηρηπ με έμα όοιρμα, αμ
θέλξσμε η οξσςίμα μεςαςοξπήπ μα βοίρκεςαι ρςημ κλάρη ςξσ
αμςικειμέμξσ ποξξοιρμξύ (δηλαδή αοιρςεοά από ςξ =), εμώ
υοηριμξπξιξύμε μία ρσμάοςηρη μεςαςοξπήπ, αμ θέλξσμε η οξσςίμα
μεςαςοξπήπ μα βοίρκεςαι ρςημ κλάρη ςξσ αμςικειμέμξσ ποξέλεσρηπ
(δηλαδή δενιά από ςξ =).

• Τα δύξ επόμεμα παοαδείγμαςα σλξπξιξύμ ςιπ δύξ ασςέπ πεοιπςώρειπ,


για ςη μεςαςοξπή μίαπ απόρςαρηπ εκτοαρμέμηπ ρςξ αγγλξρανχμικό
ρύρςημα μέςοηρηπ (πόδια και ίμςρεπ) ρε μία απόρςαρη εκτοαρμέμηπ ρςξ
διεθμέπ ρύρςημα μέςοηρηπ (μέςοα και εκαςξρςά).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
διατξοεςικώμ κλάρεχμ
1) Ρουτίνα στο αντικείμενο προορισμού
const float MTF = 3.28033;
class EngDist
{
private:
int feet;
int inches;
public:
EngDist()
{
feet = 0;
inches = 0;
}
EngDist(int feet1, int inches1)
{
feet = feet1;
inches = inches1;
}
theory_4_casting_2.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


διατξοεςικώμ κλάρεχμ
void printDist()
{
cout << feet << “ feet, “ << inches << “ inches.” << endl;
}

int getFeet()
{
return feet;
}

float getInches()
{
return inches;
}
}; // τέλος της κλάσης EngDist

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
διατξοεςικώμ κλάρεχμ
class SI_Dist
{
private:
int m;
int cm;
public:
SI_Dist()
{
m = 0;
cm = 0;
}
SI_Dist(int m1, int cm1)
{
m = m1;
cm = cm1;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


διατξοεςικώμ κλάρεχμ
SI_Dist(EngDist e)
{
int ft, in;
float mf;
ft = e.getFeet(); Για να δοθούν εκαηοζηά
in = e.getInches(); χωρίς δεκα-δικά.
mf = (ft + in/12.0) / MTF;
m = int(mf);
cm = int((mf – m) * 100);
}
void printDist()
{
cout << m << “ meters, “ << cm << “ centimetres.” << endl;
}
}; // τέλος της κλάσης SI_Dist

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
διατξοεςικώμ κλάρεχμ
main()
{
SI_Dist gr;
EngDist eng(6, 10.0);

gr = eng;
cout << “Distance (anglo-saxon imperial metric system)= “;
eng.printDist();
cout << “Distance (international metric system)= “;
gr.printDist();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


διατξοεςικώμ κλάρεχμ
2) Ρουτίμα στο αμτικείμεμο προέλευσης
const float MTF = 3.28033;
class SI_Dist
{
private:
int m; int cm;
public:
SI_Dist()
{
m = 0; cm = 0;
}
SI_Dist(int m1, int cm1)
{
m = m1; cm = cm1;
}
theory_4_casting_3.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
διατξοεςικώμ κλάρεχμ
void printDist()
{
cout << m << “ meters, “ << cm << “ centimetres.” << endl;
}
}; // τέλος της κλάσης SI_Dist

class EngDist
{
private:
int feet;
int inches;
public:
EngDist()
{
feet = 0; inches = 0;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μεςαςοξπέπ μεςανύ αμςικειμέμχμ


διατξοεςικώμ κλάρεχμ
EngDist(int feet1, int inches1)
{
feet = feet1; inches = inches1;
}
void printDist()
{
cout << feet << “ feet, “ << inches << “ inches.” << endl;
}
operator SI_Dist()
{
int met, ekat; float mf;
mf = (feet+inches/12.0) / MTF;
met = int(mf);
ekat = int((mf-met)*100);
return SI_Dist(met, ekat);
}
}; // τέλος της κλάσης EngDist

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μεςαςοξπέπ μεςανύ αμςικειμέμχμ
διατξοεςικώμ κλάρεχμ
main()
{
SI_Dist gr;
EngDist eng(6, 10.0);
gr = eng;
cout << “Anglo-saxon distance = “;
eng.printDist();
cout << “SI Distance = “;
gr.printDist();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ενότητα 5

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Περιεχόμενα ενότητασ
1. Κληρομομικότητα
2. Ιεραρτία κληρονομικόηηηας
3. Στέζεις «Is - A» και «Has - A»
4. Βαζική κλάζη βάζης και παραγόμενες
5. Παραδείγμαηα κληρονομικόηηηας
6. Φίλιες ζσναρηήζεις
7. Φίλιες κλάζεις
8. Βαζικές και παραγόμενες κλάζεις
9. Ιδιόηηηες προζηαηεσόμενων μεηαβληηών _ μελών
10. Αλλαγή προζδιοριζμού πρόζβαζης
11. Επίπεδα κληρονομικόηηηας
12. Mελέηη περίπηωζης: Ιεραρτία κληρονομικόηηηας ηριών
επιπέδων
13. Πολλαπλή κληρονομικόηηηα
14. Περιεκηικόηηηα

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Η κληοξμξμικόςηςα είμαι έμα από ςα πιξ ιρυσοά υαοακςηοιρςικά ςξσ
αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ.
Δίμαι ξ μηυαμιρμόπ πξσ επιςοέπει ρε μία κλάρη μα κληοξμξμεί όλη ςη
ρσμπεοιτξοά και ςιπ ιδιόςηςεπ μίαπ άλληπ κλάρηπ.
Η κλάρη πξσ κληοξμξμεί ξμξμάζεςαι παοάγχγη ή απξοοέξσρα κλάρη
(derived class), εμώ η κλάρη πξσ παοέυει ςημ κληοξμξμικόςηςα ξμξμάζεςαι
βαρική κλάρη (base class).
Έμα από ςα πλεξμεκςήμαςα ςηπ κληοξμξμικόςηςαπ είμαι όςι επιςοέπει ςημ
επαμαυοηριμξπξίηρη ςξσ κώδικα. Ατξύ γοατεί μία βαρική κλάρη και γίμει
εκρταλμάςχρη, δε υοειάζεςαι μα ςημ ναμαπειοάνξσμε. Μπξοξύμε μα ςημ
ποξραομόρξσμε μα λειςξσογεί ρε διάτξοεπ ρσμθήκεπ.
Η επαμαυοηριμξπξίηρη σπάουξμςξπ κώδικα ενξικξμξμεί υοόμξ, υοήμα και
ασνάμει ςημ ανιξπιρςία ςξσ ποξγοάμμαςξπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα

Υπξρςηοίζξμςαι 3 ςύπξι κληοξμξμικόςηςαπ:


(1) public
Κάθε αμςικείμεμξ μίαπ παοαγόμεμηπ κλάρηπ είμαι αμςικείμεμξ και ςηπ βαρικήπ κλάρηπ.
Αμςικείμεμα μίαπ βαρικήπ κλάρηπ δεμ είμαι αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ.
Παοάδειγμα: Όλα ςα ασςξκίμηςα είμαι ξυήμαςα, αλλά δεμ ιρυύει ςξ αμςίρςοξτξ.
Δπιςοέπεςαι η ποξρπέλαρη ςχμ μη ιδιχςικώμ μελώμ ςηπ βαρικήπ κλάρηπ.
Η παοαγόμεμη κλάρη μπξοεί μα επιτέοει αλλαγέπ ρςα ιδιχςικά μέλη ςηπ βαρικήπ
κλάρηπ, μέρχ κληοξμξμξύμεμχμ μη ιδιχςικώμ μεθόδχμ.
(2) private
Αμςίρςξιυη με ςη ρυέρη ρύμθερηπ (θα μελεςηθεί αογόςεοα).
(3) prξtected
Χοηριμξπξιείςαι ρπάμια.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Ιεοαουία κλάρεχμ
–Άμερη βαρική κλάρη: Κληοξμξμείςαι απ’ εσθείαπ (ιεοαουία εμόπ επιπέδξσ).

–Έμμερη βαρική κλάρη: Κληοξμξμείςαι ρε ιεοαουία δύξ ή πεοιρρόςεοχμ


επιπέδχμ.

–Απλή κληοξμξμικόςηςα: Μία παοαγόμεμη κλάρη ρσμδέεςαι με μία μόμξ βαρική


κλάρη.

–Πξλλαπλή κληοξμξμικόςηςα: Μία παοαγόμεμη κλάρη ρσμδέεςαι με πξλλέπ


βαρικέπ κλάρειπ. Θα ποέπει μα υοηριμξπξιείςαι με ποξρξυή.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ιεοαουία κληοξμξμικόςηςαπ
Ιεοαοχία κληοξμξμικόςηςαπ για μέλη ακαδημαϊκήπ
κξιμόςηςαπ: Μέλος Κοινόηηηας

Απλή
Υπάλληλος Σποσδαζηής Απόθοιηος κληρονομικότητα

Απλή
Ακαδημαχκός Διοικηηικός κληρονομικότητα

Απλή
Διοικών Διδάζκφν κληρονομικότητα

Πολλαπλή
Διοικών-Διδάζκφν κληρονομικότητα

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ιεοαουία κληοξμξμικόςηςαπ
Ιεοαοχία κληοξμξμικόςηςαπ για ρχήμαςα:
Στήμα

2-ΔιαζηάζεφνΣτήμα 3-ΔιαζηάζεωνΣσήμα

Κύκλος Τεηράγφνο Τρίγφνο Σθαίρα Κύβος Τεηράεδρο

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Συέρειπ «Is - A» και «Has - A»
•Συέρη «Is – A»: σπξδηλώμει ρυέρη κληοξμξμικόςηςαπ
•Έμα αμςικείμεμξ μίαπ παοαγόμεμηπ κλάρηπ μπξοξύμε μα ςξ υειοιρςξύμε και χπ
αμςικείμεμξ ςηπ βαρικήπ κλάρηπ.
•Παοάδειγμα: Ασςξκίμηςξ, Φξοςηγό, Μξςξρικλέςα Is a Όχημα
–Οι ιδιόςηςεπ/ρσμπεοιτξοά ςηπ κλάρηπ Όυημα ιρυύξσμ και για ςιπ κλάρειπ
Ασςξκίμηςξ, Φξοςηγό, Μξςξρικλέςα.

•Συέρη «Has - A»: σπξδηλώμει ρυέρη ρύμθερηπ


•Έμα αμςικείμεμξ πεοιέυει έμα ή πεοιρρόςεοα αμςικείμεμα άλλχμ κλάρεχμ χπ
μέλη.
•Παοάδειγμα: Ασςξκίμηςξ has 1 Μηχαμή, 1 Τιμόμι, 4 Πόοςεπκ.ς.λ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Βαρική κλάρη βάρηπ και παοαγόμεμεπ


• Έμα αμςικείμεμξ μίαπ παοαγόμεμηπ κλάρηπ είμαι έμα (is a) αμςικείμεμξ και
ςηπ βαρικήπ κλάρηπ.
– Παοάδειγμα: έμα Τοίγχμξ είμαι έμα Γεχμεςοικό Συήμα.
• Η κλάρη Τοίγχμξ κληοξμξμεί ςημ κλάρη Γεχμεςοικό Συήμα.
• Γεχμεςοικό Συήμα: βαρική κλάρη (base class)
• Τοίγχμξ: παοαγόμεμη κλάρη (derived class)
• Η βαρική κλάρη αμςιποξρχπεύει μία γεμικόςεοη έμμξια απ’ όςι η
παοαγόμεμη κλάρη (ρυέρη γεμίκεσρηπ/ειδίκεσρηπ).
– Παοάδειγμα:
• Base class: Όυημα
– Ασςξκίμηςξ, Φξοςηγό, Βάοκα, Πξδηλάςξ, …
• Derived class: Ασςξκίμηςξ
– Τξ ασςξκίμηςξ είμαι μια ειδική καςηγξοία ξυημάςχμ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Παοαδείγμαςα κληοξμξμικόςηςαπ

Base class Derived classes

Σποσδαζηής Μεηαπηστιακός
Προπηστιακός
Στήμα Κύκλος
Τρίγφνο
Ορθογώνιο
Δάνειο Φοιηηηικό
Καηαναλφηικό
Σηεγαζηικό
Υπάλληλος Πλήροσς Απαζτόληζης
Μερικής Απαζτόληζης
Λογαριαζμός Όυεφς
Ταμιεσηηρίοσ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Βαρικέπ και παοαγόμεμεπ κλάρειπ


Τύπξπ κληοξμξμικόςηςαπ public
Οοίζεςαι με ςημ εμςξλή:
class TwoDimensionalShape : public Shape
Η ποξρπέλαρη ςχμ ιδιχςικώμ μελώμ ςηπ βαρικήπ κλάρηπ δεμ μπξοεί μα γίμει απ’
εσθείαπ, παοόλα ασςά ςα ιδιχςικά μέλη κληοξμξμξύμςαι και μπξοξύμε μα ςα
υειοιρςξύμε μέρχ ςχμ μη ιδιχςικώμ κληοξμξμξύμεμχμ μεθόδχμ.
Τα δημόρια και ποξρςαςεσμέμα μέλη ςηπ βαρικήπ κλάρηπ κληοξμξμξύμςαι και είμαι
δσμαςή η απ’ εσθείαπ ποξρπέλαρή ςξσπ (με υοήρη ςξσ ξμόμαςξπ ςξσ μέλξσπ). Οι
τίλιεπ ρσμαοςήρειπ δεμ κληοξμξμξύμςαι.
Σσμαοςήρειπ πξσ δηλώμξμςαι ρςξ public
Η μεςαβληςή-μέλξπ ασςήπ ςηπ καςηγξοίαπ ςμήμα μίαπ κλάρηπ με ςξ ποόθεμα friend,
μπξοεί μα ποξρπελαρθεί από ρσμαοςήρειπ- αλλά ξοίζξμςαι όπωπ ξι καμξμικέπ
μέλη μέρα ρςημ δική ςηπ κλάρη ή ρε ρσμαοςήρειπ εκςόπ ςηπ κλάρηπ, χωοίπ ςξ
ξπξιαδήπξςε κλάρη πξσ κληοξμξμεί ςη class_name ::, και ποξρπελαύμξσμ ςα
δική ςηπ κλάρη. Δεμ μπξοεί μα ιδιωςικά μέλη ςωμ αμςικειμέμωμ ςηπ κλάρηπ.
ποξρπελαρθεί από ρσμαοςήρειπ ένω απ’ Καςά ρσμέπεια δε απξςελξύμ ρσμαοςήρειπ-
ασςέπ ςιπ κλάρειπ. μέλη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Φίλιεπ ρσμαοςήρειπ
#include <iostream>
using namespace std;
class Rectangle
{
private:
int width, height;
public:
Rectangle()
{}
Rectangle (int x, int y) : width(x), height(y)
{}
int area()
{
return width * height;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Φίλιεπ ρσμαοςήρειπ
friend Rectangle duplicate (const Rectangle &param);
}; // τέλος της κλάσης Rectangle
Rectangle duplicate(const Rectangle &param)
{
Rectangle res;
res.width = param.width*2;
res.height = param.height*2;
return res;
} // ορισμός της φίλιας συμάρτησης χωρίς σύμδεση με τημ κλάση
main () { Tςπικέρ πεπιπηώζειρ σπήζηρ ηων
Rectangle foo; θίλιων ζςναπηήζεων είναι λειηοςπ-
Rectangle bar (2,3); γίερ πος διεξάγονηαι ανάμεζα ζε δύο
foo = duplicate (bar); διαθοπεηικέρ κλάζειρ, πποζπελαύ-
cout << foo.area() << endl; νονηαρ ιδιωηικά ή πποζηαηεςμένα
} μέλη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Φίλιεπ κλάρειπ
Παοόμξια με ςιπ τίλιεπ ρσμαοςήρειπ, μία τίλια κλάρη έυει μέλη με ποόρβαρη ρε
ιδιχςικά ή ποξρςαςεσμέμα μέλη έςεοηπ κλάρηπ:
#include <iostream>
using namespace std;
class Square;
class Rectangle
{
private:
int width, height;
public:
int area ()
{
return (width * height);
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Φίλιεπ κλάρειπ
void convert (Square a);
}; // τέλος της κλάσης Rectangle
class Square
{
friend class Rectangle;
private:
int side;
public:
Square (int a) : side(a)
{}
}; // τέλος της κλάσης Square
void Rectangle::convert (Square a)
{
width = a.side; height = a.side;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Φίλιεπ κλάρειπ
main () {
Rectangle rect;
Square sqr (4);
rect.convert(sqr);
cout << rect.area();
}
Σε ασςό ςξ παοάδειγμα η κλάρη Rectangle είμαι τίλια κλάρη ςηπ κλάρηπ Square,
επιςοέπξμςαπ ρςιπ ρσμαοςήρειπ μέλη ςηπ Rectangle μα έυξσμ ποόρβαρη ρςα
ιδιχςικά και ποξρςαςεσμέμα μέλη ςηπ Square. Η Rectangle έυει ποόρβαρη ρςη
μεςαβληςή-μέλξπ Square::side, η ξπξία πεοιγοάτει ςημ πλεσοά ςξσ ςεςοαγώμξσ.

Ανίζει μα ρημειχθεί όςι ρςημ αουή ςξσ ποξγοάμμαςξπ σπάουει κεμή δήλχρη ςηπ
κλάρηπ Square. Η δήλχρη είμαι απαοαίςηςη διόςι η κλάρη Rectangle
υοηριμξπξιεί ςη Square (χπ παοάμεςοξ ρςξ μέλξπ convert) και η Square
υοηριμξπξιεί ςη Rectangle (δηλώμξμςάπ ςημ χπ τίλια).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Φίλιεπ κλάρειπ
Δεμ σπάουει αμξιβαιόςηςα ρςημ έμμξια ςηπ τίλιαπ κλάρηπ, καθώπ ςξ πξιξπ
είμαι τίλιξπ ποξπ πξιξμ καθξοίζεςαι οηςά και δεμ σπξμμξείςαι: Σςξ
παοάδειγμα η κλάρη Rectangle θεχοείςαι τίλια ςηπ κλάρηπ Square, αλλά η
Square δε θεχοείςαι τίλια από ςη Rectangle. Καςά ρσμέπεια, ξι
ρσμαοςήρειπ-μέλη ςηπ κλάρηπ Rectangle μπξοξύμ μα έυξσμ ποόρβαρη ρςα
ιδιχςικά και ποξρςαςεσμέμα μέλη ςηπ Square αλλά όυι ςξύμπαλιμ.
Δνσπακξύεςαι όςι ρε πεοίπςχρη πξσ η Square δηλχθεί τίλια κλάρη ςηπ
Rectangle, απξκςά ςη ρυεςική ποόρβαρη.

Η ιδιόςηςα ςχμ τίλιχμ ρσμαοςήρεχμ και κλάρεχμ δεμ είμαι μεςαβιβάριμη: Η


τίλια κλάρη μίαπ κλάρηπ τίλιαπ ποξπ ςοίςη δε θεχοείςαι τίλια ποξπ ςημ
ςοίςη, εκςόπ κι αμ ξοιρθεί οηςά.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Βαρικέπ και παοαγόμεμεπ κλάρειπ

Ποξρπέλαρη ποξρςαςεσόμεμχμ μελώμ μελώμ: Δμδιάμερξ επίπεδξ


ποξρςαρίαπ δεδξμέμχμ μεςανύ public και private.
–Η ποξρπέλαρη ςχμ ποξρςαςεσόμεμχμ μελώμ είμαι ετικςή ρε:
•Μέλη ςηπ βαρικήπ κλάρηπ
•Φίλιεπ ρσμαοςήρειπ ςηπ βαρικήπ κλάρηπ
•Μέλη ςηπ παοαγόμεμηπ κλάρηπ
•Φίλιεπ ρσμαοςήρειπ ςηπ παοαγόμεμηπ κλάρηπ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ιδιόςηςεπ ποξρςαςεσόμεμχμ μεςαβληςώμ _ μελώμ

Πλεξμεκςήμαςα:
•Οι παοαγόμεμεπ κλάρειπ μπξοξύμ μα αλλάνξσμ ςιπ ςιμέπ ςχμ πεδίχμ απ’ εσθείαπ.
•Υπάουει μικοή βελςίχρη ςηπ ςαυύςηςαπ καθώπ απξτεύγεςαι η κλήρη ςχμ μεθόδχμ
set/get.
Μειξμεκςήμαςα:
•Δεμ ποξρτέοξμςαι για έλεγυξ εγκσοόςηςαπ ςιμώμ, καθώπ η παοαγόμεμη κλάρη
μπξοεί μα δώρει μη-επιςοεπςή ςιμή.
•Δημιξσογία ρυέρεχμ ενάοςηρηπ:
–Οι μέθξδξι ςηπ παοαγόμεμηπ κλάρηπ είμαι πιξ πιθαμόμ ςώοα μα εναοςώμςαι από
ςημ σλξπξίηρη ςηπ βαρικήπ κλάρηπ.
–Δάμ αλλάνει η σλξπξίηρη ςηπ βαρικήπ κλάρηπ μπξοεί μα υοειαρςεί μα
ςοξπξπξιήρξσμε και ςημ παοαγόμεμη κλάρη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
class Account
{
protected:
float balance;
public:
Account()
{
balance = 0;
}
Account(float balance1)
{
balance = balance1;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
void withdraw(float money)
{
if (money <= balance) balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” << endl;
}
void deposit(float money)
{
balance += money;
}
float getBalance()
{
return balance;
}
}; // τέλος της κλάσης account

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
class AccInter : public Account
{
public:
void interest()
{
balance += balance*0.1;
}
};
main()
{
AccInter a1;
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance() << endl;
a1.deposit(100);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance() << endl;
a1.interest();
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance() << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Σςξ ποξηγξύμεμξ παοάδειγμα ξοίζξμςαι δύξ κλάρειπ, η Account και η AccInter.
Η ποόςαρη
class AccInter : public Account
καθξοίζει ςη ρχέρη ςηπ κληοξμξμικόςηςαπ. Η AccInter είμαι η παοάγωγη κλάρη
και κληοξμξμεί όλεπ ςιπ δσμαςόςηςεπ ςηπ βαρικήπ κλάρηπ Account.
Σςη main() δημιξσογξύμε έμα αμςικείμεμξ ςηπ κλάρηπ AccInter:
AccInter a1;
Σςξ αμςικείμεμξ δίμεςαι αοχική ςιμή 0, αμ και δεμ σπάοχει ρσμάοςηρη
εγκαςάρςαρηπ ρςημ κλάρη AccInter. Όςαμ δεμ σπάοχει ρσμάοςηρη
εγκαςάρςαρηπ ρςημ παοάγωγη κλάρη, χοηριμξπξιείςαι η ρσμάοςηρη
εγκαςάρςαρηπ από ςη βαρική κλάρη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
• Τξ αμςικείμεμξ a1 ςηπ κλάρηπ AccInter υοηριμξπξιεί ςιπ
ρσμαοςήρειπ deposit() και getBalance() ςηπ κλάρηπ Account.
Καςά ςξμ ίδιξ ςοόπξ, όςαμ ξ μεςαγλχςςιρςήπ δε βοίρκει
κάπξια ρσμάοςηρη ρςημ παοάγχγη κλάρη - δηλαδή ςημ
κλάρη ρςημ ξπξία ςξ a1 είμαι μέλξπ - αμαζηςά ςη ρσμάοςηρη
ασςή ρςη βαρική κλάρη.

• Τξ δεδξμέμξ balance ρςημ κλάρη Account έυει δηλχθεί χπ


protected. Ασςό ρημαίμει όςι ςξ δεδξμέμξ μπξοεί μα
ποξρπελαρθεί από ρσμαοςήρειπ-μέλη μέρα ρςημ δική ςξσ
κλάρη ή ρε ξπξιαδήπξςε κλάρη πξσ κληοξμξμεί ςη δική ςξσ
κλάρη. Δεμ μπξοεί μα ποξρπελαρθεί από ρσμαοςήρειπ ένχ
απ’ ασςέπ ςιπ κλάρειπ, όπχπ π.υ. η main().

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα

Πίμακαπ ποξρπελαριμόςηςαπ
(η παοάγωγη κλάρη παοάγεςαι με δημόρια ποόρβαρη)
Μέλη βαρικήπ Ποξρπελάριμα Ποξρπελάριμα Ποξρπελάριμα
κλάρηπ από ςη δική από ςημ από
ςηπ κλάρη παοάγχγη αμςικείμεμα
κλάρη ένχ από ςημ
κλάρη
public μαι μαι μαι
protected μαι μαι όυι
private μαι όυι όυι

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
Θα ποέπει μα ςξμιρθεί όςι η κληοξμξμικόςηςα δεμ λειςξσογεί
αμςίρςοξτα. Η βαρική κλάρη δεμ κληοξμξμεί ςιπ
δσμαςόςηςεπ ςηπ παοάγχγηπ κλάρηπ.
Για παοάδειγμα, εάμ δηλώρξσμε ρςη main()
Account a2;
ςξ αμςικείμεμξ ασςό μπξοεί μα υοηριμξπξιήρει ςιπ
ρσμαοςήρειπ-μέλη ςηπ δικήπ ςξσ κλάρηπ, αλλά δεμ μπξοεί,
για παοάδειγμα, μα υοηριμξπξιήρει ςη ρσμάοςηρη interest()
ςηπ κλάρηπ AccInter.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Παοάδειγμα: (1) Υλξπξίηρη υχοίπ υοήρη protected μεςαβληςώμ-μελώμ
class rectangle
{
private:
float side_a, side_b;
public:
ρσμαοςήρειπ δόμηρηπ / απξδόμηρηπ ...
float area() {
return side_a * side_b;
}
void show() {
cout << side_a << “x” << side_b << endl;
}
void set_sides(float a, float b) {
side_a = a; side_b = b;
}
}; // τέλος της βασικής κλάσης rectangle

theory_5_inheritence_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
class box : public rectangle
{
private:
float side_c;
public:
ρσμαοςήρειπ δόμηρηπ / απξδόμηρηπ ...
float volume()
{ Eπεηδή οη κεηαβιεηές – κέιε είλαη
return side_c * area(); ηδηφηηθές, ε απορρέοσζα θιάζε δελ
} έτεη πρόζβαζε ζε ασηές, οπόηε
void set_side_c(float c) θαιείηαη ε ζσλάρηεζε area γηα λα
{ ζσλεηζθέρεη ζηολ σποιογηζκό ηοσ
side_c = c; όγθοσ.
}
}; // τέλος της παράγωγης κλάσης box

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
main() {
rectangle a;
box b;
a.set_sides(10,20);
cout << “Rectangle a: ” << endl;
a.show;
cout << “Area of rectangle a = ” << a.area() << endl;
b.set_sides(20,20);
b.set_side_c(10);
cout << “Volume of box b = ” << b.volume() << endl;
cout << “Area of rectangle included in box b = ” << b.area();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
(2) Υλξπξίηρη με υοήρη protected μεςαβληςώμ-μελώμ
class rectangle {
prξtected:
float side_a, side_b;
public:
...
}; // τέλος της κλάσης rectangle
class box : public rectangle
Eπεηδή οη κεηαβιεηές – κέιε ηες
{
βαζηθής θιάζες protected, ε
private:
απορρέοσζα θιάζε έτεη πρόζαβζε
float side_c;
ζε ασηές, οπόηε δελ απαηηείηαη θιήζε
public:
ηες ζσλάρηεζες area γηα λα
float volume() {
σποιογηζζεί ο όγθος.
return side_a * side_b * side_c;
}
...
}; // τέλος της παράγωγης κλάσης box

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Σσμαοςήρειπ δόμηρηπ ςηπ παοάγωγηπ κλάρηπ
Σςξ ποξηγξύμεμξ ποόγοαμμα, εάμ θελήρξσμε μα απξδώρξσμε αουική ςιμή ρςξ αμςικείμεμξ a1 ςηπ
παοάγχγηπ κλάρηπ ασςό δε θα είμαι ετικςό, γιαςί εμώ ξ μεςαγλχςςιρςήπ υοηριμξπξιεί μία
ρσμάοςηρη δόμηρηπ από ςη βαρική κλάρη όςαμ είμαι υχοίπ ξοίρμαςα, δεμ μπξοεί μα ςξ κάμει για
ρσμαοςήρειπ με ξοίρμαςα. Για μα ςξ πεςύυξσμε ασςό, ποέπει μα γοάφξσμε ρσμαοςήρειπ δόμηρηπ
για ςημ παοάγχγη κλάρη.

class AccInter : public Account


{
public:
AccInter() : Account()
{}
AccInter(float bal) : Account(bal) Η ηηκή γηα ηελ bal ηες AccInter ζα
{} αλαδεηεζεί ζηελ bal ηες Account.
void interest()
{
balance += balance*0.1;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
Οπόςε ςώοα μπξοξύμε μα δημιξσογήρξσμε αμςικείμεμα ςηπ παοάγχγηπ
κλάρηπ και μα ςα απξδώρξσμε αουικέπ ςιμέπ:
main()
{
AccInter a1, a2(100);
}
Όςαμ δημιξσογξύμε αμςικείμεμα ρςη main(), ςόςε καλξύμςαι ξι αμάλξγεπ
ρσμαοςήρειπ δόμηρηπ για μα απξδώρξσμ αουικέπ ςιμέπ. Με ςη δήλχρη
AccInter a1;
εκςελείςαι η ποόςαρη
AccInter() : Account()
όπξσ η ρσμάοςηρη δόμηρηπ AccInter() καλεί ςημ αμςίρςξιυη ρσμάοςηρη
δόμηρηπ Account() για ςημ αουικξπξίηρη ςξσ αμςικειμέμξσ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα

Παοόμξια, με ςη δήλχρη
AccInter a2(100);
εκςελείςαι η ποόςαρη
AccInter(float bal) : Account(bal)
όπξσ καλείςαι η ρσμάοςηρη δόμηρηπ AccInter() με έμα
όοιρμα. Ασςή με ςη ρειοά ςηπ καλεί ςημ αμςίρςξιυη
ρσμάοςηρη Account() με έμα όοιρμα και ςηπ μεςαβιβάζει ςξ
όοιρμα, για μα απξδξθεί χπ αουική ςιμή ρςξ αμςικείμεμξ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
Σσμαοςήρειπ δόμηρηπ ςηπ παοάγωγηπ κλάρηπ
όςαμ η ςελεσςαία έχει δικέπ ςηπ μεςαβληςέπ-μέλη
Δπεκςείμξμςαπ ςξ ποξηγξύμεμξ ποόγοαμμα, θεχοξύμε όςι η παοάγχγη κλάρη έυει ςη μξοτή:
class AccInter : public Account
{
private:
float interest_rate;
public:
AccInter(float bal, float int_rate) : Account(bal),interest_rate(int_rate)
{}
void interest()
{
balance += balance * interest_rate;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα

main()
{
AccInter a1(100,0.1);
cout << "Current balance a1 = " << a1.getBalance() << endl;
a1.deposit(100);
cout << "Current balance a1 = " << a1.getBalance() << endl;
a1.interest();
cout << "Current balance a1 = " << a1.getBalance() << endl;
}
100 + 100

200 + (200 * 0.1)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
Υπεοτόοςχρη ρσμαοςήρεχμ-μελώμ

Σε μία παοάγχγη κλάρη μπξοξύμε μα γοάφξσμε ρσμαοςήρειπ-μέλη


πξσ έυξσμ ςξ ίδιξ όμξμα με κάπξιεπ ρσμαοςήρειπ ςηπ βαρικήπ κλάρηπ.
Σςξ παοάδειγμα πξσ ενεςάζξσμε, ξι ρσμαοςήρειπ deposit() και
withdraw() δέυξμςαι χπ όοιρμα έμα υοημαςικό πξρό και ςξ ποξρθέςξσμ ή ςξ
αταιοξύμ αμςίρςξιυα από ςξ ςοέυξμ πξρό ςξσ λξγαοιαρμξύ. Δεμ ενεςάζεςαι
όμχπ η πεοίπςχρη καςά ςημ ξπξία ςξ πξρό πξσ πεομά χπ όοιρμα είμαι
αομηςικό. Θα μπξοξύρε βέβαια ξ έλεγυξπ ασςόπ μα ποξρςεθεί καςεσθείαμ ρςιπ
ρσμαοςήρειπ ρςη βαρική κλάρη. Για μα μημ «αλλξιώρξσμε» όμχπ ςξμ κώδικα
ςηπ βαρικήπ κλάρηπ, θα ςξπξθεςήρξσμε ςξμ έλεγυξ ασςό ρςημ παοάγχγη
κλάρη:

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
class AccInter : public Account
{
public:
AccInter() : Account()
{}
AccInter(float bal) : Account(bal)
{}
void interest() {
balance += balance*0.1;
}
void deposit(float money) {
if (money>0) Account::deposit(money);
else cout << “Τξ πξρό δεμ είμαι έγκσοξ.”;
}
void withdraw(float money) {
if (money>0) Account::withdraw(money);
else cout << “Τξ πξρό δεμ είμαι έγκσοξ.”;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα

main()
{
AccInter a1;

a1.deposit(100);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance();
a1.deposit(-10);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance();
a1.withdraw(50);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance();
a1.withdraw(-5);
cout << “Τοέυξμ πξρό λξγαοιαρμξύ a1 = “ << a1.getBalance();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Όςαμ εκςελείςαι η ποόςαρη
a1.deposit(100);
καλείςαι η ρσμάοςηρη deposit(), ςημ ξπξία ξ μεςαγλχςςιρςήπ αμαζηςά ρςημ
παοάγχγη κλάρη, ςη βοίρκει και ςημ εκςελεί. Δκεί γίμεςαι ξ έλεγυξπ εάμ ςξ
όοιρμα είμαι θεςικό πξρό και ετόρξμ είμαι εκςελείςαι η ποόςαρη
Account::deposit(money);
όπξσ καλείςαι η ρσμάοςηρη deposit() ςηπ βαρικήπ κλάρηπ και ςηπ
μεςαβιβάζεςαι ςξ πξρό χπ όοιρμα.
Κάςι αμάλξγξ ιρυύει και για ςη ρσμάοςηρη withdraw(). Γεμικά
μπξοξύμε μα πξύμε όςι όςαμ σπάουει η ίδια ρσμάοςηρη ρςη βαρική και ρςημ
παοάγχγη κλάρη, ςόςε εκςελείςαι η ρσμάοςηρη ρςημ παοάγχγη κλάρη (για
αμςικείμεμα ςηπ παοάγχγηπ κλάρηπ). Δπίρηπ, μα ςξμίρξσμε όςι για μα γίμει η
κλήρη ςχμ ρσμαοςήρεχμ deposit() και withdraw() ςηπ βαρικήπ κλάρηπ μέρα
από ςιπ αμςίρςξιυεπ ρσμαοςήρειπ ςηπ παοάγχγηπ κλάρηπ, υοηριμξπξιείςαι ξ
ςελερςήπ διάκοιρηπ εμβέλειαπ ::, αλλιώπ ξι ρσμαοςήρειπ θα καλξύραμ ςξμ
εασςό ςξσπ και ασςό θα ξδηγξύρε ςξ ποόγοαμμα ρε απξςσυία.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ
Υπάουξσμ πξλλέπ δσμαςόςηςεπ ποξρπέλαρηπ. Σςξ ποόγοαμμα πξσ
ακξλξσθεί μπξοξύμε μα δξύμε διάτξοξσπ ρσμδσαρμξύπ ποξρπέλαρηπ,
για μα καςαμξήρξσμε πξιξι ρσμδσαρμξί είμαι έγκσοξι και θα
λειςξσογήρξσμ:
#include <iostream.h>
class A // βασική κλάση
{
private:
int privdataA;
protected:
int protdataA;
public:
int pubdataA;
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ

class B : public A // κλάση που παράγεται δημόσια


{
public:
void funct( )
{
int a;
a = privdataA; // λάθος: μη προσπελάσιμο
a = protdataA; // σωστό
a = pubdataA; // σωστό
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ

class C : private A // κλάση που παράγεται ιδιωτικά


{
public: Όλα ςα δημόρια και ποξρςαςεσμέμα μέλη ςηπ
βαρικήπ κλάρηπ γίμξμςαι ιδιωςικά μέλη ςηπ
void funct( )
παοάγωγηπ κλάρηπ: εμώ είμαι ποξρβάριμα από
{ ςα σπόλξιπα μέλη ςηπ παοάγωγηπ κλάρηπ, δεμ
int a; είμαι διαθέριμα ρε κώδικα εκςόπ ςηπ κλάρηπ.
a = privdataA; // λάθος: μη προσπελάσιμο
a = protdataA; // σωστό
a = pubdataA; // σωστό
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ

class D : protected A // κλάση που παράγεται προστατευμέμα


{
public: Όλα ςα δημόρια και ποξρςαςεσμέμα μέλη ςηπ
βαρικήπ κλάρηπ γίμξμςαι ποξρςαςεσμέμα μέλη
void funct( )
ςηπ παοάγωγηπ κλάρηπ. Η παοάγωγη κλάρη έχει
{ ποόρβαρη ςόρξ ρςα δημόρια όρξ και ρςα
int a; ποξρςαςεσμέμα μέλη πξσ κληοξμόμηρε.
a = privdataA; // λάθος: μη προσπελάσιμο
a = protdataA; // σωστό
a = pubdataA; // σωστό
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κληοξμξμικόςηςα

Ποξρδιξοιρςικό ποόρβαρηπ Κληοξμξμξύμςαι από ςημ


κληοξμξμικόςηςαπ Μέλη βαρικήπ κλάρηπ παοάγχγη κλάρη χπ ...

public public δημόρια

public private ιδιχςικά υχοίπ ποόρβαρη

public protected ποξρςαςεσμέμα

private public ιδιχςικά

private private ιδιχςικά υχοίπ ποόρβαρη

private protected ιδιχςικά

protected public ποξρςαςεσμέμα

protected private ιδιχςικά υχοίπ ποόρβαρη

protected protected ποξρςαςεσμέμα

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ
Σςξ ποόγοαμμα ξοίζεςαι μία βαρική κλάρη A όπξσ δηλώμξμςαι ιδιχςικά,
ποξρςαςεσμέμα και δημόρια δεδξμέμα. Δπίρηπ με βάρη ςημ κληοξμξμικόςηςα,
ξοίζξμςαι ςοειπ παοάγχγεπ κλάρειπ: Η B πξσ παοάγεςαι δημόρια, η C πξσ
παοάγεςαι ιδιχςικά και η D πξσ παοάγεςαι ποξρςαςεσμέμα.
Δίδαμε ποιμ όςι ξι ρσμαοςήρειπ-μέλη ςχμ παοάγχγχμ κλάρεχμ μπξοξύμ
μα ποξρπελάρξσμ ποξρςαςεσμέμα και δημόρια δεδξμέμα ςηπ βαρικήπ κλάρηπ.
Δπίρηπ, αμςικείμεμα ςηπ παοάγχγηπ κλάρηπ δεμ μπξοξύμ μα ποξρπελάρξσμ
ποξρςαςεσμέμα και ιδιχςικά δεδξμέμα ςηπ βαρικήπ κλάρηπ.
Αμςικείμεμα ςηπ παοάγχγηπ κλάρηπ μπξοξύμ μα ποξρπελάρξσμ
δημόρια δεδξμέμα ςηπ βαρικήπ κλάρηπ, μόμξμ ετόρξμ η κλάρη παοάγεςαι
δημόρια (π.υ. η B).
Αμςικείμεμα παοάγχγηπ κλάρηπ πξσ παοάγεςαι ιδιχςικά (π.υ. η C) δεμ
μπξοξύμ μα ποξρπελάρξσμ ξύςε δημόρια δεδξμέμα ςηπ βαρικήπ κλάρηπ.
Αμ δε δώρξσμε κάπξιξμ καθξοιρςή ποξρπέλαρηπ όςαμ δημιξσογξύμε
μία κλάρη, σπξςίθεςαι όςι είμαι ιδιχςικόπ (private).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Αλλαγή ποξρδιξοιρμξύ ποόρβαρηπ
Για μα αλλαυθεί ξ ποξρδιξοιρμόπ ποόρβαρηπ για κάπξιξ μέλξπ ςηπ βαρικήπ κλάρηπ (π.υ.
μία ρσμάοςηρη), θα ποέπει μα γίμει η ακόλξσθη ποξρθήκη ρςημ παοάγχγη κλάρη:
class rectangle {
Έρςχ όςι επιδιώκεςαι η αλλαγή
private:
ρςξμ ποξρδιξοιρμό ποόρβαρηπ
float side_a, side_b;
ςηπ ρσμάοςηρηπ area, ώρςε μα
public:
καςαρςεί ιδιχςική.
float area() {
return side_a * side_b;
}
void show() {
cout << side_a << side_b << endl;
}
void set_sides(float a, float b) {
side_a = a; side_b = b;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Αλλαγή ποξρδιξοιρμξύ ποόρβαρηπ

Η αλλαγή ποξρδιξοιρμξύ γίμεςαι μέρα από ςημ παοάγχγη κλάρη:


To ποξρδιξοιρςικό using υοηρι-
class box : public rectangle μξπξιείςαι μέρα ρςξμ υώοξ ςχμ
{ ιδιχςικώμ δηλώρεχμ, για μα
private: δηλώρει όςι η ρσμάοςηρη area() ςηπ
float side_c; κλάρηπ rectangle θα κληοξμξμηθεί
using rectangle :: area; χπ ιδιχςική κι όυι χπ δημόρια, όπχπ
public: καθξοίζει ςξ ποξρδιξοιρςικό
float volume() κληοξμξμικόςηςαπ ςηπ κλάρηπ box.
{
Τξσ ποξρδιξοιρςικξύ using ςηπ
return area() side_c;
ρσμάοςηρηπ-μέλξπ ποέπει μα έπεςαι
}
ςξ όμξμα ςηπ βαρικήπ κλάρηπ,
void set_sides(float c)
ακξλξσθξύμεμξ από ςξμ ςελερςή ::.
{
side_c = c; Δεμ ξοίζεςαι η λίρςα παοαμέςοχμ
} ςηπ ρσμάοςηρηπ-μέλξπ, παοά μόμξ
}; ςξ όμξμά ςηπ υχοίπ ςιπ παοεμθέρειπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δπίπεδα κληοξμξμικόςηςαπ
Μία κλάρη μπξοεί μα παοαυθεί από μία άλλη κλάρη, η ξπξία
και η ίδια είμαι παοάγχγη.

class A
{};
class B : public A
{};
class C : public B
{};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ


ςοιώμ επιπέδχμ

Σημείξ -> Κύκλξπ -> Κύλιμδοξπ


Σημείξ
• Zεύγξπ ρσμςεςαγμέμχμ x-y
Κύκλξπ
• Zεύγξπ ρσμςεςαγμέμχμ x-y
• Ακςίμα
Κύλιμδοξπ
• Zεύγξπ ρσμςεςαγμέμχμ x-y
• Ακςίμα
• Ύφξπ
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ
ςοιώμ επιπέδχμ
#include <cstdlib>
#include <iostream>
#include <iomanip>
public:
using namespace std;
Point(int x,int y);
const double my_pi=3.14159; void setX(int x);
int getX();
class Point void setY(int y);
{ int getY();
private: void print(); // εκτύπωση
int x; // Τετμημέμη // σημείου
int y; // Τεταγμέμη }; // Τέλος της κλάσης Point
theory_5_hier_inh_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ


ςοιώμ επιπέδχμ
class Circle : public Point
Κληοξμξμεί ςημ Point.
{
private:
double radius; // Aκτίμα του κύκλου
public:
Circle(int = 0,int = 0, double radius = 0.0);
void setRadius(double radius);
double getRadius();
double getDiameter(); // Υπολογίζει τη διάμετρο
double getCircumference(); // Υπολογίζει τημ περιφέρεια
double getArea(); // Υπολογίζει το εμβαδόμ
void print(); // Eκτύπωση αμτικειμέμου κλάσης Circle
}; // Τέλος της κλάσης Circle

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ
ςοιώμ επιπέδχμ

class Cylinder : public Circle Κληοξμξμεί ςημ Circle, η


ξπξία έχει κληοξμξμήρει
{
ςημ Point.
private:
double height; // Ύψος του κυλίμδρου
public:
Cylinder(int = 0,int = 0,double = 0.0, double = 0.0);
void setHeight(double height);
double getHeight();
double getArea(); // Υπολογίζει το εμβαδόμ
double getVolume(); // Υπολογίζει τομ όγκο
void print();
}; // Τέλος της κλάσης Cylinder

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ


ςοιώμ επιπέδχμ
Point :: Point(int xValue,int yValue) : x(xValue), y(yValue)
{}
void Point :: setX(int xValue) {
x = xValue;
}
int Point :: getX() {
return x; Δοκεηής ηες Point
}
void Point :: setY(int yValue) {
y = yValue;
}
int Point :: getY() {
return y;
}
void Point :: print() {
cout << '[' << x << ", " << y << ']';
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ
ςοιώμ επιπέδχμ
Circle::Circle(int xValue,int yValue,double radiusValue) :
Point(xValue,yValue)
{
setRadius(radiusValue); // ή αλλιώς ο κώδικας της setRadius
}
void Circle::setRadius(double radiusValue)
{
if (radiusValue < 0.0) radius = 0.0;
else radius = radiusValue;
}
double Circle::getRadius() Δξμηςήπ ςηπ Circle, όπξσ
αοχικξπξιξύμςαι και ξι κληοξμξ-
{
μξύμεμεπ μεςαβληςέπ από ςημ
return radius; Point.
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ


ςοιώμ επιπέδχμ
double Circle::getDiameter() {
return 2 * getRadius();
} Eθ λέοσ ορηζκός ηες
double Circle::getCircumference() { ζσλάρηεζες print, ώζηε λα
return my_pi * getDiameter(); εθησπώλεηαη θαη ε αθηίλα ηοσ
} θύθιοσ.
double Circle::getArea() {
return my_pi * getRadius() * getRadius();
}
void Circle::print() { Καλείται η σσνάρτηση print της βασικής ως προς τη
cout << "Center = "; Circle κλάσης Point, με τρήση τοσ τελεστή::.
Point::print();
cout << "; Radius = " << getRadius();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ
ςοιώμ επιπέδχμ
Cylinder::Cylinder(int xValue, int yValue, double radiusValue, double
heightValue ) : Circle( xValue, yValue, radiusValue )
{
setHeight( heightValue );
}
void Cylinder::setHeight(double heightValue)
{
if (heightValue < 0.0) height = 0.0;
else height = heightValue;
}
double Cylinder::getHeight()
{ Δξμηςήπ ςηπ Cylinder, όπξσ
return height; αοχικξπξιξύμςαι και ξι κληοξμξμξύμεμεπ
} μεςαβληςέπ από ςημ Circle και, έμμερα,
ασςέπ ςηπ Point.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ


ςοιώμ επιπέδχμ
Καλείται η σσνάρτηση getArea της βασικής
double Cylinder::getArea() ως προς τη Cylinder κλάσης Circle, με τρήση
{ τοσ τελεστή::.
return 2 * Circle::getArea() + getCircumference() * getHeight();
}

double Cylinder::getVolume()
{
return Circle::getArea() * getHeight();
} Eθ λέοσ ορηζκός ηες
void Cylinder::print() ζσλάρηεζες getArea, ώζηε λα
{ σποιογίδεηαη πιέολ ηο εκβαδόλ
Circle::print(); ηοσ θσιίλδροσ.
cout << "; Height = " << getHeight();
} Eθ λέοσ ορηζκός ηες
Καλείται η σσνάρτηση print της βασικής ως προς τη ζσλάρηεζες print, ώζηε λα
Cylinder κλάσης Circle, με τρήση τοσ τελεστή::. εθησπώλεηαη θαη ηο ύυος ηοσ
θσιίλδροσ.
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ
ςοιώμ επιπέδχμ
main()
Kαλξύμςαι ξι έμμερα
{ κληοξμξ-μξύμεμεπ
Cylinder cylinder( 12, 23, 2.5, 5.7 ); ρσμαοςήρειπ-μέλη ςηπ
Point.
cout << "Initial cylinder's parameters\n";
cout << "-----------------------------\n";
cout << "\tX-coordinate is " << cylinder.getX()
<< "\n\tY-coordinate is " << cylinder.getY()
<< "\n\tRadius is " << cylinder.getRadius()
<< "\n\tHeight is " << cylinder.getHeight();
cylinder.setX(4); // Νέα τετμημέμη
cylinder.setY(8); // Νέα τεταγμέμη
Kαλείςαι η άμερα κληοξμξ-
cylinder.setRadius(5.5); // Νέα ακτίμα μξύμεμη ρσμάοςηρη-μέλξπ
cylinder.setHeight(10.0); // Νέο ύψος ςηπ Circle.
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Mελέςη πεοίπςχρηπ: Ιεοαουία κληοξμξμικόςηςαπ


ςοιώμ επιπέδχμ
cout << "\n\n---------------------------------\n";
cout << "The new cylinder's parameters are:\n\t"; Kαλείςαι η επαμακα-
cylinder.print(); θξοιρμέμη ρσμάοςηρη
print.
cout << fixed << setprecision(2);
cout << "\n\n\tDiameter is " << cylinder.getDiameter();
cout << "\n\tCircumference is " << cylinder.getCircumference();
cout << "\n\tArea is " << cylinder.getArea();
cout << "\n\tVolume is " << cylinder.getVolume();
} Kαλείςαι η επαμακα-
θξοιρμέμη ρσμάοςηρη
getArea.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πξλλαπλή κληοξμξμικόςηςα
Μία κλάρη μπξοεί μα παοαυθεί από πεοιρρόςεοεπ από μία κλάρειπ.

class A
{};
class B
{};
class C : public A, public B
{};

Αμχςέοχ ξοίζξμςαι δύξ βαρικέπ κλάρειπ, ξι A και B, και μία ςοίςη κλάρη
η C, η ξπξία παοάγεςαι και από ςημ Α και από ςημ Β.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πξλλαπλή κληοξμξμικόςηςα
Mία κλάρη μπξοεί μα δημιξσγηθεί μέρχ κληοξμξμικόςηςαπ από
πεοιρρόςεοεπ ςηπ μίαπ βαρικέπ κλάρειπ, διαυχοιζόμεμεπ με κόμμα (,)
ρςξμ καςάλξγξ ςχμ βαρικώμ κλάρεχμ. Για παοάδειγμα, εάμ έμα
ποόγοαμμα διέθεςε μία κλάρη Output για εκςύπχρη ρςημ ξθόμη και
επιθσμξύραμε δύξ κλάρειπ Rectangle και Triangle μα κληοξμξμξύμ ςα
μέλη ςηπ μαζί με εκείμα μίαπ ςάνηπ Polygon, ςόςε θα γοάταμε ςξμ
ακόλξσθξ κώδικα:
#include <iostream>
using namespace std;
class Polygon
{
protected:
int width, height;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πξλλαπλή κληοξμξμικόςηςα
public:
Polygon (int a, int b) : width(a), height(b)
{}
}; // τέλος της κλάσης Polygon
class Output
{
public:
static void print (int i);
}; // τέλος της κλάσης Output
void Output :: print (int i)
{
cout << i << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πξλλαπλή κληοξμξμικόςηςα
class Rectangle : public Polygon, public Output
{
public:
Rectangle (int a, int b) : Polygon(a,b)
{}
int area ()
{
return width*height;
}
}; // τέλος της κλάσης Rectangle

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πξλλαπλή κληοξμξμικόςηςα
class Triangle : public Polygon, public Output
{
public:
Triangle (int a, int b) : Polygon(a,b)
{}
int area ()
{
return width*height/2;
}
}; // τέλος της κλάσης Triangle

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πξλλαπλή κληοξμξμικόςηςα
main()
{
Rectangle rect (4,5);
Triangle trgl (4,5);
cout << endl << “The area of rect = ”;
rect.print(rect.area());
cout << endl << “The area of trgl = ”;
Triangle :: print(trgl.area());
}

theory_5_mul_inh.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πεοιεκςικόςηςα
Η κληοξμξμικόςηςα μαπ δίμει ςη δσμαςόςηςα μα ξοίρξσμε μία ρυέρη
αμάμερα ρε δύξ κλάρειπ Α και Β. Μία άλλη ρυέρη πξσ μπξοεί μα ξοιρθεί
καλείςαι πεοιεκςικόςηςα. Ακξλξύθχπ έυξσμε ςημ πεοίπςχρη όπξσ έμα
αμςικείμεμξ ςηπ κλάρηπ Β πεοιέυεςαι μέρα ρςημ κλάρη Α.

class B
{
………………
};
class A
{
………………
B b;
………………
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πεοιεκςικόςηςα

#include <cstdlib>
#include <iostream>

using namespace std;

class Borrow
{
private:
char studname[20];
char bdate[10];
public:
Borrow()
{
strcpy(studname, " ");
strcpy(bdate, " ");
} theory_5_aggreg_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πεοιεκςικόςηςα

Borrow(char studname1[], char bdate1[]) {


strcpy(studname, studname1);
strcpy(bdate, bdate1);
}
void readData() {
cout << "Give student name:";
cin >> studname;
cout << "Give date:";
cin >> bdate;
}
void printData() {
cout << "Student name: " << studname << endl;
cout << "Date borrowed: " << bdate << endl;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πεοιεκςικόςηςα

class Book
{
private:
int number; char title[30];
Borrow b;
public:
Book() {
number = 0;
strcpy(title," ");
}
Book(int number0, char title0[], Borrow b0)
{
number = number0;
strcpy(title, title0);
b = b0;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πεοιεκςικόςηςα
void readData()
{
cout << "Give book number:";
cin >> number;
cout << "Give book title:";
cin >> title;
b.readData();
}
void printData()
{
cout << "Book number: " << number << endl;
cout << "Book title: " << title << endl;
b.printData();
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πεοιεκςικόςηςα
main()
{
Book bk1(1445, "C++ Programming", Borrow("SPANOS",
"13/12/13")), bk2;
bk1.printData();
cout << endl;
bk2.readData();
cout << endl;
bk2.printData();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ενότητα 6

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Περιεχόμενα ενότητασ
1. Δείκςεπ
2. Δείκςεπ – δσμαμική διαυείοιρη μμήμηπ
3. Δείκςεπ για αμςικείμεμα
4. Πίμακεπ δεικςώμ ποξπ αμςικείμεμα
5. Ο δείκςηπ this
6. Πξλσμξοτιρμόπ (Polymorphism)
7. Κλήρη ρσμαοςήρεωμ ςηπ βαρικήπ κλάρηπ από αμςικείμεμα ςηπ παοαγόμεμηπ
κλάρηπ
8. Δείκςηπ ςηπ παοάγωγηπ κλάρηπ ρε αμςικείμεμξ ςηπ βαρικήπ κλάρηπ
9. Κλήρη ρσμάοςηρηπ παοάγωγηπ κλάρηπ
μέρω δείκςη βαρικήπ κλάρηπ
10. Εικξμικέπ ρσμαοςήρειπ (virtual functions)
11. Εικξμικέπ και μη εικξμικέπ ρσμαοςήρειπ
12. Γμήριεπ εικξμικέπ ρσμαοςήρειπ
13. Ατηοημέμεπ κλάρειπ
14. Μελέςη πεοίπςωρηπ εικξμικώμ ρσμαοςήρεωμ
15. Εικξμικέπ ρσμαοςήρειπ απξδόμηρηπ
16. Μελέςη πεοίπςωρηπ πξλσμξοτιρμξύ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δείκςεπ

Ο δείκτης είμαι μία μεταβλητή που περιέχει τη διεύθυμση


μίας άλλης μεταβλητής.

Η υοήρη δεικςώμ είμαι αοκεςά ρσμηθιρμέμη ρε αοκεςέπ


γλώρρεπ ποξγοαμμαςιρμξύ όπχπ και ρςημ C++. Αμ και
πξλλέπ λειςξσογίεπ μπξοξύμ μα σλξπξιηθξύμ και με
άλλξσπ ςοόπξσπ, εμ ςξύςξιπ ρε αοκεςέπ πεοιπςώρειπ ξι
δείκςεπ γίμξμςαι έμα ποξγοαμμαςιρςικό εογαλείξ για
αύνηρη ςηπ δύμαμηπ ςηπ γλώρραπ ποξγοαμμαςιρμξύ, όπχπ
είμαι κάπξιεπ δξμέπ δεδξμέμχμ (ξι ρσμδεδεμέμεπ λίρςεπ,
ςα δσαδικά δέμδοα κ.λ.π.).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δείκςεπ

Μεοικέπ από ςιπ πλέξμ ρσμηθιρμέμεπ υοήρειπ ςξσπ είμαι:


•Ποξρπέλαρη ρςξιυείχμ πίμακα
•Μεςαβίβαρη ξοιρμάςχμ ρε ρσμάοςηρη, όςαμ η ρσμάοςηρη ποέπει μα αλλάνει
ςξ αουικό όοιρμα
•Μεςαβίβαρη πιμάκχμ και αλταοιθμηςικώμ ρε ρσμαοςήρειπ
•Απόκςηρη μμήμηπ από ςξ ρύρςημα
•Δημιξσογία δξμώμ δεδξμέμχμ όπχπ ξι ρσμδεδεμέμεπ λίρςεπ

Δάμ καςά ςη δήλχρη εμόπ δείκςη επιθσμξύμε μα μημ έυει αποξρδιόοιρςη ςιμή,
ςόςε ςξμ αουικξπξιξύμε ρςξ NULL και όυι ρςξ 0:

int *my_pointer = NULL;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δείκςεπ – δσμαμική διαυείοιρη μμήμηπ

Οι δείκςεπ λειςξσογξύμ με βάρη ςημ έμμξια ςηπ εμμερόςηςαπ. Έμαπ


δείκςηπ είμαι μία μεςαβληςή, ρςημ ξπξία έυει απξθηκεσςεί χπ ςιμή μία
διεύθσμρη ςηπ μμήμηπ ςξσ σπξλξγιρςή. Σςη διεύθσμρη ασςή αμςιρςξιυεί
έμα ξοιρμέμξ πεοιευόμεμξ ςηπ μμήμηπ, πξσ είμαι η ςιμή εμόπ ξοιρμέμξσ
δεδξμέμξσ. Τόςε, ξ δείκςηπ ασςόπ έυει δσμαςόςηςα έμμερηπ ποόρβαρηπ
ρςημ ςιμή ασςξύ ςξσ δεδξμέμξσ.

Όςαμ υοειαζόμαρςε μμήμη για ςημ απξθήκεσρη πξλλώμ ρςξιυείχμ,


ρσμήθχπ υοηριμξπξιξύμε πίμακεπ. Οι πίμακεπ όμχπ έυξσμ ςξ μειξμέκςημα
όςι ποέπει μα καθξοιρθεί ςξ μέγεθόπ ςξσπ και μάλιρςα ποιμ ςημ εκςέλερη
ςξσ ποξγοάμμαςξπ. Σε πξλλέπ, όμχπ, πεοιπςώρειπ δε γμχοίζξσμε πόρη
μμήμη θα υοειαρςξύμε εκ ςχμ ποξςέοχμ.

Η C++ μαπ παοέυει, μέρχ μέχμ ςελερςώμ, ςη δσμαςόςηςα μα


δερμεύρξσμε και μα απξδερμεύρξσμε ςμήμαςα μμήμηπ, πέοαμ ςχμ
μεθόδχμ πξσ έυξσμε μάθει. Οι ςελερςέπ ασςξί είμαι ξι new και delete.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δείκςεπ
#include <cstdlib>
#include <iostream>

using namespace std;

struct person {
int id; char name[20];
};
main() {
struct person *ptr;
ptr = new struct person;
cout << "Give an ID:\t"; cin >> ptr->id;
cout << "Give a name:\t"; cin >> ptr->name;
cout << "\n\n\tID: " << ptr->id;
cout << "\n\n\tName: " << ptr->name;
delete ptr;
} theory_6_point_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δείκςεπ
Η υοήρη ςξσ ςελερςή new είμαι παοόμξια με ςη υοήρη ςηπ
ρσμάοςηρηπ malloc() ςηπ C. Η μέα ποξρέγγιρη με ςξμ new είμαι
καλύςεοη γιαςί επιρςοέτει έμαμ δείκςη για ςξμ καςάλληλξ ςύπξ
δεδξμέμχμ, εμώ ξ δείκςηπ ςηπ malloc() ποέπει μα ποξραομξρθεί
(casting) ρςξμ καςάλληλξ ςύπξ.

Παοαςήοηρη: Σε παλαιόςεοξσπ μεςαγλχςςιρςέπ ςηπ C++, εάμ δεμ


σπήουε επαοκήπ διαθέριμη μμήμη για ςη δημιξσογία μίαπ μέαπ
μεςαβληςήπ ή αμςικειμέμξσ, ρςξμ δείκςη απξδίδεςξ ςξ NULL.
Σςημ ποόςσπη C++ εάμ δεμ σπάουει επαοκήπ διαθέριμη μμήμη, ξ
ςελερςήπ new ςεομαςίζει ςξ ποόγοαμμα.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δείκςεπ για αμςικείμεμα


Οι δείκςεπ, πέοα από ςξσπ ρσμήθειπ ςύπξσπ δεδξμέμχμ, μπξοξύμ μα δείυμξσμ
και ρε αμςικείμεμα. Αμ καςά ςη ρςιγμή πξσ γοάτξσμε έμα ποόγοαμμα, δε
γμχοίζξσμε πόρα αμςικείμεμα θα δημιξσογήρξσμε, ςόςε μπξοξύμε μα
υοηριμξπξιήρξσμε ςξμ ςελερςή new. Ο new επιρςοέτει έμαμ δείκςη ρε έμα
αμώμσμξ αμςικείμεμξ και μπξοξύμε έςρι μα δημιξσογήρξσμε αμςικείμεμα καςά ςη
διάοκεια εκςέλερηπ ςξσ ποξγοάμμαςξπ. cin >> id;
class Person { cout << “Δώρε έμα όμξμα:”;
private: cin >> name; }
int id; void printData() {
char name[20]; cout << “Κχδικόπ: “ << id
public: << endl;
void readData() { cout << “Όμξμα: “ << name
<< endl; }
cout << “Δώρε κχδικό:”;
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δείκςεπ για αμςικείμεμα
main() {
Person *p;
p = new Person; p→readData(); p→printData();
}
Δηλώμεςαι έμαπ δείκςηπ p ρε έμα αμςικείμεμξ ςύπξσ Person, με ςξμ ςελερςή new
δερμεύεςαι μμήμη για ςξ αμςικείμεμξ και ξοίζεςαι ξ δείκςηπ p μα δείυμει ρςξ
ρσγκεκοιμέμξ αμςικείμεμξ.
Για μα αματεοθξύμε ρςιπ ρσμαοςήρειπ-μέλη ςξσ αμςικειμέμξσ υοηριμξπξιξύμε ςξμ
ςελερςή ποξρπέλαρηπ μέλξσπ -> (ςελερςήπ βέλξσπ).
Καςά ςη δέρμεσρη μμήμηπ εμόπ αμςικειμέμξσ μπξοεί μα
υοηριμξπξιηθεί δξμηςήπ με ξοίρμαςα, όπχπ ακοιβώπ γίμεςαι και
ρςη ρσμήθη δήλχρη αμςικειμέμξσ υχοίπ δσμαμική δέρμεσρη
μμήμηπ. Π.υ. για δξμηςή MyClass(int x, int y) μίαπ κλάρηπ MyClass:
MyClass *myPointer;
myPointer = new MyClass(4, -17);

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πίμακεπ δεικςώμ ποξπ αμςικείμεμα


Όταμ σε έμα πρόγραμμα δημιουργούμε πολλά αμτικείμεμα, είμαι πιο ευέλικτο
αμτί μα τοποθετήσουμε τα ίδια τα αμτικείμεμα στομ πίμακα, μα χρησιμοποιήσούμε
έμαμ πίμακα δεικτώμ προς αυτά:
class Person {
private:
int id; char name[20];
public:
void readData() {
cout << “Δώρε κχδικό:”; cin >> id;
cout << “Δώρε έμα όμξμα:”; cin >> name;
}
void printData() {
cout << “Κχδικόπ: “ << id << endl;
cout << “Όμξμα: “ << name << endl;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Πίμακεπ δεικςώμ ποξπ αμςικείμεμα
main()
{
Person *perspin[100];
int i = 0, j;
char choice;
do
{
perspin[i] = new Person;
perspin[i] →readData();
i++;
cout << “More?”;
cin >> choice;
} while (choice == „y‟);
for (j=0; j<i; j++) perspin[j] →printData();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ο δείκςηπ this
Οι ρσμαοςήρειπ-μέλη κάθε αμςικειμέμξσ έυξσμ ποόρβαρη ρε έμαμ «αόοαςξ»
δείκςη πξσ ξμξμάζεςαι this. Έςρι κάθε ρσμάοςηρη-μέλξπ μπξοεί μα αμακαλύφει
ςη διεύθσμρη ςξσ αμςικειμέμξσ ρςξ ξπξίξ αμήκει. Δπιπλέξμ ξ δείκςηπ this
μπξοεί μα υοηριμξπξιηθεί όπχπ κάθε άλλξπ δείκςηπ για κάπξιξ αμςικείμεμξ και
έςρι μπξοεί μα ποξρπελάρει δεδξμέμα ρςξ αμςικείμεμξ πξσ αματέοεςαι.
Βέβαια, για λόγξσπ εσκξλίαπ ρσμήθχπ η αματξοά ρςα δεδξμέμα ασςά γίμεςαι
άμερα, παοαλείπξμςαπ ςξμ δείκςη this. Μία πιξ ποακςική υοήρη ςξσ this
ποξκύπςει όςαμ μία ρσμάοςηρη-μέλξπ εμόπ αμςικειμέμξσ θέλει μα επιρςοέφει
ςξ αμςικείμεμξ πξσ ςημ έυει καλέρει.
Γεμικά μπξοξύμε μα ιρυσοιρςξύμε όςι, για λόγξσπ καςαμόηρηπ, είμαι ρχρςό μα
γίμεςαι η υοήρη ςξσ δείκςη this. Για λόγξσπ όμχπ ξικξμξμίαπ είμαι ποξςιμόςεοξ
μα παοαλείπεςαι και η αματξοά ρςα δεδξμέμα ςξσ αμςικειμέμξσ μα γίμεςαι
άμερα.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ο δείκςηπ this
Τξ παοακάςχ παοάδειγμα δείυμει πώπ μπξοεί μα γίμει η υοήρη ςξσ this:
#include <iostream>
class Employee {
private:
float mikta; int categ;
public:
Employee() {
this→mikta = 0;
this→categ = 0;
}
Employee(float mikta0, int categ0)
{
this→mikta = mikta0;
this→categ = categ0;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ο δείκςηπ this
void showAddress() {
cout << "The address of the object is " << this << endl;
}
float calcTax() {
float foros;
if (this→categ == 1) foros = this→mikta * 0.15;
else foros = this→mikta * 0.3;
return foros;
}
float calcSalary() {
float misthos;
misthos = this→mikta - this→calcTax();
return misthos;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ο δείκςηπ this

main()
{
Employee emp(1000,1);

emp.showAddress();
cout << "The salary is: " << emp.calcSalary() << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Πξλσμξοτιρμόπ (Polymorphism)
Αματέοεςαι ρςη δσμαςόςηςα μα ρσμδσάζξσμε πξλλά
πεοιευόμεμα ρε έμα όμξμα ρσμάοςηρηπ μέρχ ςξσ μηυαμιρμξύ
ςηπ δσμαμικήπ ρύμδερηπ. Δπξμέμχπ πξλσμξοτιρμόπ, δσμαμική
ρύμδερη και εικξμικέπ ρσμαοςήρειπ είμαι ξσριαρςικά
εκτάμρειπ ςηπ ίδιαπ έμμξιαπ, όπχπ θα αμαλύρξσμε
ακξλξύθχπ.
Απαιςείςαι η ύπαονη μίαπ ιεοαουίαπ κλάρεχμ.
Χοηριμξπξιξύμε αμςικείμεμα πξσ αμήκξσμ ρςημ ίδια ιεοαουία
κλάρεχμ χπ μα ήςαμ όλα αμςικείμεμα ςηπ βαρικήπ κλάρηπ.
Δπιςοέπει ςημ απξςελερμαςική επέκςαρη ςχμ ποξγοαμμάςχμ,
καθώπ μέεπ κλάρειπ μπξοξύμ εύκξλα μα ποξρςεθξύμ και μα
σπξρςξύμ επενεογαρία όπχπ και ξι σπάουξσρεπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από
αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
Υπάουξσμ ςοειπ διατξοεςικξί ςοόπξι υειοιρμξύ ςχμ δεικςώμ ρε
αμςικείμεμα μίαπ ιεοαουίαπ κλάρεχμ:
Δείκςηπ βαρικήπ κλάρηπ ρε αμςικείμεμξ ςηπ βαρικήπ κλάρηπ
Δείκςηπ παοάγχγηπ κλάρηπ ρε αμςικείμεμξ ςηπ παοάγχγηπ
κλάρηπ
Δείκςηπ βαρικήπ κλάρηπ ρε αμςικείμεμξ ςηπ παοάγχγηπ
κλάρηπ
Η κλήρη ρσμαοςήρεχμ εναοςάςαι από ςημ κλάρη ςξσ δείκςη και
δεμ εναοςάςαι από ςξ αμςικείμεμξ ρςξ ξπξίξ δείυμει ξ δείκςηπ.
Ασςό μπξοεί μα αλλάνει με ςη υοήρη ςχμ εικξμικώμ
ρσμαοςήρεχμ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από


αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
#include <cstdlib>
#include <iostream>
#include <iomanip>
public:
using namespace std; Point(int x,int y);
void setX(int x);
const double my_pi=3.14159; int getX();
void setY(int y);
class Point
int getY();
{
private: void print(); // εκςύπωρη
int x; // Τεςμημέμη // ρημείξσ
int y; // Τεςαγμέμη }; // Τέλος της κλάσης Point

theory_6_polym_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από
αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
Point :: Point(int xValue,int yValue) : x(xValue), y(yValue)
{}
void Point :: setX(int xValue) {
x = xValue;
}
int Point :: getX() {
return x;
} Δομητής της Point
void Point :: setY(int yValue) {
y = yValue;
}
int Point :: getY() {
return y;
}
void Point :: print() {
cout << '[' << x << ", " << y << ']';
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από


αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
class Circle : public Point Κληρονομεί την Point.
{
private:
double radius; // Aκςίμα ςξσ κύκλξσ
public:
Circle(int = 0,int = 0, double radius = 0.0);
void setRadius(double radius);
double getRadius();
double getDiameter(); // Υπξλξγίζει ςη διάμεςοξ
double getCircumference(); // Υπξλξγίζει ςημ πεοιτέοεια
double getArea(); // Υπξλξγίζει ςξ εμβαδόμ
void print();
}; // Τέλος της κλάσης Circle Επαναπποζδιοπιζμόρ ηηρ ζςνάπηηζηρ print

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από
αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
Circle::Circle(int xValue,int yValue,double radiusValue) :
Point(xValue,yValue)
{
setRadius(radiusValue); // ή αλλιώπ ξ κώδικαπ ςηπ setRadius
}
void Circle::setRadius(double radiusValue)
{
if (radiusValue < 0.0) radius = 0.0;
else radius = radiusValue;
}
Δομητής της Circle, όποσ
double Circle::getRadius()
αρτικοποιούνται και οι κληρονο-
{ μούμενες μεταβλητές από την Point.
return radius;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από


αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
double Circle::getDiameter() {
return 2 * getRadius();
}
Eκ νέοσ ορισμός της σσνάρτησης
double Circle::getCircumference() {
print, ώστε να εκτσπώνεται και η
return my_pi * getDiameter();
ακτίνα τοσ κύκλοσ.
}
double Circle::getArea() {
return my_pi * getRadius() * getRadius();
}
void Circle::print() {
cout << "Center = ";
Point::print();
Καιείηαη ε ζσλάρηεζε print ηες βαζηθής ως προς ηελ Cycle
cout << "; Radius = " << getRadius();
} θιάζες Point, κε τρήζε ηοσ ηειεζηή::.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από
αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
main()
{
Point point(30,50), *pointPtr; // Δείκςηπ βαρικήπ κλάρηπ
Circle circle(120,89,2.7), *circlePtr; // Δείκςηπ παοάγωγηπ
// κλάρηπ
cout << fixed << setprecision( 2 );
cout << "Print point and circle objects:" << "\nPoint: ";
point.print();
cout << "\nCircle: "; Η θιήζε ηες ζσλάρηεζες print γίλεηαη κε τρήζε
circle.print(); αληηθεηκέλωλ, ηα οποία αλήθοσλ ζηελ ίδηα θιάζε, έηζη ώζηε
pointPtr = &point; λα θαιείηαη ε θαηάιιειε print.
cout << "\n\nCalling print with base-class pointer to "
<< "\nbase-class object invokes base-class print "
<< "function:\n";
pointPtr → print();

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από


αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ
circlePtr = &circle;
cout << "\n\nCalling print with derived-class pointer to "
<< "\nderived-class object invokes derived-class "
<< "print function:\n";
circlePtr → print();
pointPtr = &circle;
cout << "\n\nCalling print with base-class pointer to "
<< "derived-class object\ninvokes base-class print "
<< "function on that derived-class object:\n";
pointPtr → print(); Επηηρέπεηαη έλα δείθηες βαζηθής θιάζες λα «δείτλεη» ζε έλα
} αληηθείκελο παράγωγες θιάζες (Circle “is a” Point). Ωζηόζο,
θαιεί ηε ζσλάρηεζε print ηες θιάζες Point, όπως θαζορίδεηαη από
ηολ ηύπο ηοσ δείθηε. Οη εηθοληθές ζσλαρηήζεης επηηρέποσλ λα
αιιατζεί ασηό.
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Κλήρη ρσμαοςήρεχμ ςηπ βαρικήπ κλάρηπ από
αμςικείμεμα ςηπ παοαγόμεμηπ κλάρηπ

Έμαπ δείκςηπ ςηπ βαρικήπ κλάρηπ μπξοεί μα υοηριμξπξιηθεί


μόμξ για ποόρβαρη ρςα μέλη εμόπ αμςικειμέμξσ ςηπ παοάγχγηπ
κλάρηπ πξσ έυξσμ κληοξμξμηθεί άπό ςη βαρική κλάρη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δείκςηπ ςηπ παοάγχγηπ κλάρηπ ρε αμςικείμεμξ ςηπ


βαρικήπ κλάρηπ

Σςξ ποξηγξύμεμξ παοάδειγμα είδαμε δείκςη ςηπ βαρικήπ κλάρηπ ρε


αμςικείμεμξ ςηπ παοάγχγηπ κλάρηπ (Circle “is a” Point).

Δάμ υοηριμξπξιηθεί δείκςηπ παοάγχγηπ κλάρηπ ρε αμςικείμεμξ ςηπ βαρικήπ


κλάρηπ θα ποξκύφει ρτάλμα μεςαγλώςςιρηπ (Point is not a Circle). Η κλάρη
Circle διαθέςει ιδιόςηςεπ/λειςξσογίεπ πξσ δεμ διαθέςει η κλάρη Point (π.υ.
setRadius).

Μπξοξύμε μα κάμξσμε μεςαςοξπή ςύπξσ (casting) ρςη διεύθσμρη ςξσ


αμςικειμέμξσ ςηπ βαρικήπ κλάρηπ ρε δείκςη παοάγχγηπ κλάρηπ: Ομξμάζεςαι
downcasting και επιςοέπει ςημ ποξρπέλαρη λειςξσογικόςηςαπ ςηπ
παοάγχγηπ κλάρηπ (λεπςξμέοειεπ ρε επόμεμεπ διατάμειεπ).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δείκςηπ ςηπ παοάγχγηπ κλάρηπ ρε αμςικείμεμξ ςηπ
βαρικήπ κλάρηπ

main()
{
Point point(30, 50);
Circle *circlePtr;
circlePtr = &point;
}

theory_6_polym_2.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Κλήρη ρσμάοςηρηπ παοάγχγηπ κλάρηπ


μέρχ δείκςη βαρικήπ κλάρηπ
O δείκςηπ βαρικήπ κλάρηπ μπξοεί μεμ μα δείυμει ρε αμςικείμεμξ ςηπ παοάγχγηπ
κλάρηπ αλλά μπξοεί μα καλέρει μόμξ ςιπ μεθόδξσπ ςηπ βαρικήπ κλάρηπ. Η κλήρη
μεθόδχμ ςηπ παοάγχγηπ κλάρηπ ρσμιρςά λάθξπ, καθώπ ξι μέθξδξι ασςέπ δεμ ξοίζξμςαι
ρςη βαρική κλάρη. Ο ςύπξπ δεδξμέμχμ εμόπ δείκςη ποξρδιξοίζει ςι μεθόδξσπ μπξοξύμε
μα καλέρξσμε.
main() {
Point *pointPtr;
Circle circle( 120, 89, 2.7 );
pointPtr = &circle;
int x = pointPtr → getX();
int y = pointPtr → getY();
pointPtr → setX( 10 );
pointPtr → setY( 10 );
pointPtr → print();

theory_6_polym_3.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Κλήρη ρσμάοςηρηπ παοάγχγηπ κλάρηπ
μέρχ δείκςη βαρικήπ κλάρηπ

double radius = pointPtr->getRadius();


pointPtr → setRadius( 33.33 );
double diameter = pointPtr → getDiameter();
double circumference = pointPtr → getCircumference();
double area = pointPtr → getArea();
}
Ασηές οη ζσλαρηήζεης ορίδοληαη κόλο
ζηελ θιάζε Circle. Ωζηόζο ο pointPtr
είλαη θιάζες Point.

theory_6_polym_3.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ ρσμαοςήρειπ (virtual functions)


Ο καμόμαπ είμαι ξ ςύπξπ ςξσ δείκςη μα καθξοίζει ςι μέθξδξι μπξοξύμ μα κληθξύμ. Οι
εικξμικέπ ρσμαοςήρειπ μπξοξύμ μα ςξμ αλλάνξσμ, ώρςε ςξ αμςικείμεμξ (και όυι ξ δείκςηπ)
μα καθξοίζει ςι μέθξδξι μπξοξύμ μα κληθξύμ, έςρι ώρςε μέρχ εμόπ δείκςη ςηπ βαρικήπ
κλάρηπ μα καλξύμςαι ρσμαοςήρειπ-μέλη ςχμ παοάγχγχμ κλάρεχμ.
Δικξμική είμαι μία ρσμάοςηρη πξσ ρςημ ποαγμαςικόςηςα δεμ σπάουει, αλλά εμταμίζεςαι
χπ ποαγμαςική ρε ξοιρμέμα ςμήμαςα εμόπ ποξγοάμμαςξπ. Μία ςέςξια ρσμάοςηρη θα ήςαμ
υοήριμη αμ είυαμε έμα πλήθξπ αμςικειμέμχμ από διατξοεςικέπ κλάρειπ και θέλαμε μα ςα
ςξπξθεςήρξσμε όλα ρε μία λίρςα, ώρςε μα εκςελέρξσμε κάπξια ρσγκεκοιμέμη λειςξσογία
υοηριμξπξιώμςαπ ςημ ίδια κλήρη ρσμάοςηρηπ.
class A {
public:
virtual void display() {
cout << "Βase class.";
}
};

theory_6_vf_1.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ ρσμαοςήρειπ

class Par1 : public A {


public:
void display() {
cout << "1st derived class.";
}
};
Σηιρ παπάγωγερ κλάζειρ δε
class Par2 : public A { σπηζιμοποιείηαι ηο πποζδιοπιζηικό
public: virtual για ηιρ εικονικέρ ζςναπηήζειρ.
void display() {
cout << "2nd derived class.";
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ ρσμαοςήρειπ
main( )
{
Par1 p1;
Par2 p2;
A *ptr;
ptr = &p1;
ptr→display();
ptr = &p2;
ptr→display();
}

H βαρική κλάρη A και ξι δύξ παοάγχγεπ ςηπ A, Par1 και Par2 έυξσμ μία
ρσμάοςηρη με ςξ ίδιξ όμξμα, display(). Oι ρσμαοςήρειπ ποξρπελαύμξμςαι με
υοήρη δεικςώμ. Θα ποέπει μα ρημειχθεί όςι ρςη βαρική κλάρη μποξρςά από ςξ
δηλχςικό ςηπ ρσμάοςηρηπ έυει ποξρςεθεί η δερμεσμέμη λένη virtual.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ ρσμαοςήρειπ
Δν αιςίαπ ασςήπ ςηπ ποξρθήκηπ, όςαμ εκςελείςαι η ποόςαρη
ptr→display();
καλείςαι η ρσμάοςηρη ςηπ παοάγχγηπ κλάρηπ, εμώ αμ παοαλειπόςαμ η λένη
virtual θα καλείςξ η ρσμάοςηρη display() ςηπ βαρικήπ κλάρηπ. Δηλαδή όςαμ μία
ρσμάοςηρη δηλχθεί virtual ξ μεςαγλχςςιρςήπ επιλέγει ςη ρσμάοςηρη με βάρη
ςξ πεοιευόμεμξ ςξσ δείκςη και όυι ςξμ ςύπξ ςξσ δείκςη, ακόμη κι αμ η εικξμική
ρσμάοςηρη υοηριμξπξιείςαι έμμερα, καλξύμεμη ρςξμ ξοιρμό μίαπ
κληοξμξμξύμεμηπ ρσμάοςηρηπ. Ασςή η μέθξδξπ καθξοιρμξύ μίαπ εικξμικήπ
ρσμάοςηρηπ πξσ θα υοηριμξπξιηθεί είμαι γμχρςή χπ δσμαμική ή
καθσρςεοημέμη ρύμδερη (dynamic/late binding).

Μία κλάρη πξσ πεοιέυει εικξμικέπ ρσμαοςήρειπ καλείςαι και πξλσμξοτική


κλάρη.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ ρσμαοςήρειπ
Όςαμ ξ ξοιρμόπ μίαπ εικξμικήπ ρσμάοςηρηπ αλλάζει μέρα ρε μία παοάγχγη
κλάρη, ςόςε αματέοεςαι όςι ξ ξοιρμόπ ρσμάοςηρηπ σπεοβαίμεςαι (overridden).
Σςη βιβλιξγοατία ςηπ C++ γίμεςαι διαυχοιρμόπ μεςανύ ςχμ ξοίχμ
επαμαποξρδιξοιρμόπ και σπέοβαρη.
Και ξι δύξ όοξι αματέοξμςαι ρςημ αλλαγή ςξσ ξοιρμξύ μίαπ ρσμάοςηρηπ μέρα
ρε μία παοάγχγη κλάρη. Αμ η ρσμάοςηρη είμαι μία εικξμική ρσμάοςηρη, ασςή
η εμέογεια καλείςαι σπέοβαρη. Αμ η ρσμάοςηρη δεμ είμαι μία εικξμική
ρσμάοςηρη, καλείςαι επαμαποξρδιξοιρμόπ. Οι δύξ ασςέπ πεοιπςώρειπ
αμςιμεςχπίζξμςαι διατξοεςικά από ςξμ μεςαγλχςςιρςή.
Η εικξμικέπ ρσμαοςήρειπ κληοξμξμξύμςαι, επξμέμχπ θεχοξύμςαι εικξμικέπ και
ρε επόμεμξ επίπεδξ κληοξμξμικόςηςαπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ ρσμαοςήρειπ
Καμόμεπ για ςη υοήρη εικξμικώμ ρσμαοςήρεχμ:
(α) Μία εικξμική ρσμάοςηρη ποέπει μα είμαι μέλξπ μίαπ κλάρηπ και μα μημ είμαι
ρςαςική.
(β) Κάθε «έκδξρη» ςηπ εικξμικήπ ρσμάοςηρηπ ρςιπ παοάγχγεπ κλάρειπ ποέπει
μα έυει ςξ ίδιξ «απξςύπχμα» με εκείμξ ςηπ βαρικήπ κλάρηπ, δηλαδή ποέπει μα
είμαι ςξσ ίδιξσ ςύπξσ και μα έυει ςξμ ίδιξ αοιθμό και ςύπξ παοαμέςοχμ.
(γ) Οι εικξμικέπ ρσμαοςήρειπ κληοξμξμξύμςαι: Υπξθέςξσμε όςι η κλάρη BC
διαθέςει μία εικξμική ρσμάοςηρη vf() και η DC παοάγεςαι από ςημ κλάρη BC.
Για μία κλάρη DC_to_DC, η ξπξία παοάγεςαι από ςημ κλάρη DC, η ρσμάοςηρη
vf() θεχοείςαι εικξμική παοά ςξ γεγξμόπ όςι μέρα ρςημ κλάρη DC δεμ έυει
δηλχθεί χπ εικξμική μέρχ ςξσ ποξρδιξοιρςικξύ virtual.
(δ) Δεμ επιςοέπεςαι ρε μία ρσμάοςηρη δόμηρηπ μα είμαι εικξμική, εμώ ξι
ρσμαοςήρειπ απξδόμηρηπ μπξοξύμ μα δηλχθξύμ χπ εικξμικέπ (θα εξεταστεί στη
συνέχεια).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ ρσμαοςήρειπ
Πόςε υοηριμξπξιείςαι μία εικξμική ρσμάοςηρη:
Δίμαι ταμεοό όςι ξι εικξμικέπ ρσμαοςήρειπ έυξσμ πλεξμεκςήμαςα και γι‟ ασςόμ
ςξμ λόγξ ρςη Java όλεπ ξι ρσμάοςήρειπ είμαι εικξμικέπ. Ωρςόρξ σπάουει έμα
μεγάλξ λειςξσογικό κόρςξπ μεςαςοέπξμςαπ μία ρσμάοςηρη ρε εικξμική, επειδή
έςρι υοηριμξπξιείςαι πεοιρρόςεοη μμήμη και ςξ ποόγοαμμα εκςελείςαι πιξ αογά
από όρξ θα εκςελείςξ εάμ η ρσμάοςηρη δεμ ήςαμ εικξμική.
Ασςή είμαι η αιςία πξσ ξι ρυεδιαρςέπ ςηπ C++ έδχραμ ρςξμ ποξγοαμμαςιρςή ςξμ
έλεγυξ μα απξταρίζει πξιεπ ρσμαοςήρειπ μέλη είμαι εικξμικέπ και πξιεπ όυι.
Σςημ πεοίπςχρη πξσ η ςαυύςηςα είμαι ρημαμςικόπ παοάγξμςαπ, ςόςε η υοήρη
εικξμικώμ ρσμαοςήρεχμ ποέπει μα γίμεςαι με τειδώ.
Πάμτως θα πρέπει μα σημειωθεί ότι η ιδιότητα τωμ εικομικώμ συμαρτήσεωμ
επιτρέπει σε έμα πρόγραμμα μα καλέσει συμαρτήσεις που δεμ υφίσταμται καμ
τημ ώρα που ο κώδικας μεταγλωττίζεται.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ ρσμαοςήρειπ
Παοάδειγμα: Χοήρη εικξμικώμ ρσμαοςήρεχμ για μα ποξρπελαρθεί με εμιαίξ ςοόπξ
(επαμαληπςική ποόςαρη) πλήθξπ αμςικειμέμχμ πξσ ποξέουξμςαι από διατξοεςικέπ
παοάγχγεπ κλάρειπ ςηπ ίδιαπ βαρικήπ κλάρηπ.
#include <iostream>
using namespace std;
class polygon {
protected:
float width,height;
public:
void set(float a, float b) {
width = a; height = b;
}
virtual void show() {
cout << "Polygon" << endl;
}
};
theory_6_vf_2.cpp

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ ρσμαοςήρειπ
class rectangle : public polygon {
public:
rectangle(float p, float y)
{
set(p,y);
}
float area()
{
return(width * height);
}
void show()
{
cout << "Rectangle:\t" << width << " x " << height << endl;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ ρσμαοςήρειπ
class triangle : public polygon {
public:
triangle(float p, float y)
{
set(p,y);
}
float area()
{
return(width * height / 2);
}
void show()
{
cout << "Triangle:\t" << width << " x " << height << endl;
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ ρσμαοςήρειπ
main() Με τρήση εικονικών σσναρτήσεων
{
int i;
rectangle r1(2,2),r2(4,6),r3(5,8);
triangle t1(4,2),t2(5,5);
polygon *poly_ptr[5];
poly_ptr[0]=&r1;
poly_ptr[1]=&t1;
poly_ptr[2]=&r3; Χωρίς τρήση εικονικών σσναρτήσεων
poly_ptr[3]=&t2;
poly_ptr[4]=&r2;
for (i=0;i<5;i++)
poly_ptr[i] -> show();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ και μη εικξμικέπ ρσμαοςήρειπ
Οι μη εικξμικέπ ρσμαοςήρειπ επιλύξμςαι καςά ςξ ρςάδιξ ςηπ μεςαγλώςςιρηπ,
δηλαδή η διεύθσμρη ςξσ κώδικα ςηπ ρσμάοςηρηπ πξσ θα κληθεί καθίρςαςαι
γμχρςή ρςξ ρςάδιξ ςηπ μεςαγλώςςιρηπ. Ο μηυαμιρμόπ ασςόπ καλείςαι ρςαςική
ρύμδερη (static binding). Aμςίθεςα ξι εικξμικέπ ρσμαοςήρειπ υοηριμξπξιξύμ ςξμ
μηυαμιρμό ςηπ δσμαμικήπ ρύμδερηπ, ρύμτχμα με ςξμ ξπξίξ ξι εικξμικέπ
ρσμαοςήρειπ επιλύξμςαι καςά ςημ εκςέλερη ςξσ ποξγοάμμαςξπ.
Ασςόπ είμαι ξ λόγξπ για ςξμ ξπξίξ με ςη υοήρη εμόπ δείκςη ςηπ βαρικήπ κλάρηπ
μπξοξύμε μα καλέρξσμε μόμξ ςιπ ρσμαοςήρειπ-μέλη ςηπ βαρικήπ κλάρηπ,
ακόμη κι όςαμ ξ δείκςηπ δείυμει ρε αμςικείμεμα παοάγχγχμ κλάρεχμ.
Όςαμ μεςαγλχςςίζεςαι έμα ποόγοαμμα, ξ μεςαγλχςςιρςήπ δε γμχοίζει ςι θα
πεοιέυει έμαπ δείκςηπ ςηπ βαρικήπ κλάρηπ, απλά γμχοίζει ςξμ ςύπξ ςξσ και ςξμ
ρσμδέει ρςαςικά με ςιπ διεσθύμρειπ ςχμ ρσμαοςήρεχμ-μελώμ ςηπ βαρικήπ
κλάρηπ ρςημ ξπξία αμήκει.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Δικξμικέπ και μη εικξμικέπ ρσμαοςήρειπ


Όςαμ μία ρσμάοςηρη δηλχθεί χπ εικξμική, η διεύθσμρη ςηπ ρσμάοςηρηπ πξσ
θα κληθεί καθξοίζεςαι καςά ςξμ υοόμξ εκςέλερηπ ςξσ ποξγοάμμαςξπ και
αμάλξγα με ςημ παοάγχγη κλάρη ςξσ αμςικειμέμξσ ρςξ ξπξίξ δείυμει ξ
δείκςηπ.
Ο μεςαγλχςςιρςήπ ςηπ C++ δημιξσογεί έμαμ πίμακα, πξσ ξμξμάζεςαι v-table,
για κάθε κλάρη πξσ πεοιέυει έρςχ και μία εικξμική ρσμάοςηρη. Κάθε έμαπ από
ασςξύπ ςξσπ πίμακεπ πεοιέυει ςιπ διεσθύμρειπ ςχμ εικξμικώμ ρσμαοςήρεχμ ςηπ
κλάρηπ. Δπίρηπ ξ μεςαγλχςςιρςήπ δημιξσογεί έμα δείκςη (v-pointer) από κάθε
αμςικείμεμξ ςηπ κλάρηπ ποξπ ςξμ πίμακα v-table.
Αμάλξγα λξιπόμ με ςξμ ςύπξ ςξσ αμςικειμέμξσ ρςξ ξπξίξ δείυμει έμαπ δείκςηπ
ςηπ βαρικήπ κλάρηπ, καςά ςξ ρςάδιξ ςηπ εκςέλερηπ ςξσ ποξγοάμμαςξπ,
ακξλξσθώμςαπ ςξμ δείκςη v-pointer ποξπ ςξμ αμςίρςξιυξ v-table ςηπ κλάρηπ,
εμςξπίζεςαι η διεύθσμρη και επξμέμχπ ξ κώδικαπ ςηπ ρσμάοςηρηπ πξσ θα
κληθεί.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Γμήριεπ εικξμικέπ ρσμαοςήρειπ
Σςξ ποξηγξύμεμξ παοάδειγμα η κλάρη polygon υοηριμξπξιείςαι απξκλειρςικά
χπ βαρική κλάρη, υχοίπ μα παοάγει δικά ςηπ αμςικείμεμα. Καςά ρσμέπεια δεμ
έυει μόημα ξι εικξμικέπ ρσμαοςήρειπ ςηπ μα έυξσμ κώδικα, γιαςί ασςόπ δεμ
ποόκειςαι πξςέ μα υοηριμξπξιηθεί. Για ςξ λόγξ ασςό ειράγεςαι η έμμξια ςηπ
γμήριαπ εικξμικήπ ρσμάοςηρηπ (pure virtual function), η ξπξία δηλώμεςαι με
ςημ ακόλξσθη γεμική ρύμςανη:

virtual data_type function_name(parameters,…) = 0;

Δπξμέμχπ η γμήρια εικξμική ρσμάοςηρη είμαι μία καμξμική εικξμική


ρσμάοςηρη υχοίπ όμχπ ρώμα. Η αμάθερη ςξσ μηδεμόπ είμαι ξ ςοόπξπ με ςξμ
ξπξίξ ξ μεςαγλχςςιρςήπ αμςιλαμβάμεςαι όςι μία εικξμική ρσμάοςηρη είμαι
γμήρια.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Γμήριεπ εικξμικέπ ρσμαοςήρειπ


Με βάρη ςα παοαπάμχ, η κλάρη polygon ςξσ ποξηγξύμεμξσ
παοαδείγμαςξπ ρσμςάρρεςαι χπ ακξλξύθχπ:
class polygon {
protected:
float width,height;
public:
void set(float a, float b) {
width = a; height = b;
}
virtual void show() = 0;
virtual area() = 0;
};
Δημιοςπγείηαι και μία ζςνάπηηζη μέλορ area ωρ
γνήζια εικονική, ώζηε δείκηερ ηηρ βαζικήρ κλάζηρ να
μποπούν να σειπιζηούν και ηη ζςνάπηηζη area ηων
theory_6_vf_3.cpp παπάγωγων κλάζεων.
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
Γμήριεπ εικξμικέπ ρσμαοςήρειπ
main() {
int i;
rectangle r1(2,2),r2(4,6),r3(5,8);
triangle t1(4,2),t2(5,5);
polygon *poly_ptr[5];
poly_ptr[0]=&r1;
poly_ptr[1]=&t1;
poly_ptr[2]=&r3;
poly_ptr[3]=&t2;
poly_ptr[4]=&r2;
for (i=0;i<5;i++) {
poly_ptr[i]->show();
cout << "\tArea=" << poly_ptr[i]->area() << endl;
}
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ατηοημέμεπ κλάρειπ
•Μία κλάρη πξσ πεοιέυει ςξσλάυιρςξμ μία γμήρια εικξμική ρσμάοςηρη
ξμξμάζεςαι ατηοημέμη κλάρη (abstract class). Μία ατηοημέμη κλάρη μπξοεί
μα υοηριμξπξιηθεί απξκλειρςικά χπ βαρική κλάρη για ςημ παοαγχγή άλλχμ
κλάρεχμ. Δεμ μπξοξύμ μα δημιξσογηθξύμ αμςικείμεμα μίαπ ατηοημέμηπ
κλάρηπ καθώπ δεμ σπάουει πλήοηπ ξοιρμόπ κλάρηπ. Μία ατηοημέμη κλάρη
έυει μεοικό ξοιρμό κλάρηπ, διόςι μπξοεί μα πεοιέυει χπ μέλη ρσμαοςήρειπ πξσ
δεμ είμαι γμήριεπ εικξμικέπ ρσμαοςήρειπ.

•Δάμ παοαυθεί μία κλάρη από ατηοημέμη κλάρη, η παοαγόμεμη κλάρη είμαι
και η ίδια ατηοημέμη, εκςόπ εάμ γοατξύμ ξοιρμξί για όλεπ ςιπ
κληοξμξμξύμεμεπ γμήριεπ εικξμικέπ ρσμαοςήρειπ και παοάλληλα δεμ
ειραυθξύμ μέεπ γμήριεπ εικξμικέπ ρσμαοςήρειπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
Σςηοιζόμεμξι ρε ποξηγξύμεμξ παοάδειγμα ιεοαουίαπ κληοξμξμικόςηςαπ (Point,
Circle, Cylinder), θεχοξύμε όςι η αουική βαρική κλάρη είμαι η Shape.
Παοαςίθεμςαι ξι λειςξσογίεπ ςηπ κάθε κλάρηπ:
#include <iostream>
#include <string> // C++ standard string class
#include <iomanip>
#include <vector>
using namespace std;
class Shape {
public:
virtual double getArea() {
return 0.0;
theory_6_case_study_1.cpp
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ


virtual double getVolume()
{ Εηθοληθή ζσλάρηεζε
return 0.0;
}
virtual string getName() = 0; // επιρςοέτει ςξ όμξμα ςηπ Shape
virtual void print() = 0; // ένξδξπ ςηπ Shape
}; // ςέλξπ ςηπ κλάρηπ Shape

Γλήζηες εηθοληθές ζσλαρηήζεης


class Point : public Shape
{
private:
int x;
int y;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
public:
Point(int xValue, int yValue) {
x = xValue;
y = yValue;
}
void setX(int xValue) {
x = xValue;
}
int getX() const {
return x;
}
void setY(int yValue) {
y = yValue;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ


int getY()
{
return y;
}
string getName()
{
return "Point";
}
void print()
{
cout << '[' << getX() << ", " << getY() << ']';
}
};

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
class Circle : public Point
{
private:
double radius;
public:
Circle( int xValue, int yValue, double radiusValue )
: Point( xValue, yValue ) // call base-class constructor
{
setRadius(radiusValue);
}
void setRadius(double radiusValue) {
radius = ( radiusValue < 0.0 ? 0.0 : radiusValue );
}
double getRadius() {
return radius;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ


double getDiameter() {
return 2 * getRadius();
}
double getCircumference() {
return 3.14159 * getDiameter();
}
double getArea() {
return 3.14159 * getRadius() * getRadius();
}
// σπέοβαρη ςηπ εικξμικήπ ρσμάοςηρηπ getName:
// επιρςοέτεςαι ςξ όμξμα ςηπ Circle
string getName() {
return "Circle";
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
// σπέοβαρη ςηπ εικξμικήπ ρσμάοςηρηπ print:
void print()
{
cout << "center is ";
Point::print(); // κλήρη ςηπ ρσμάοςηρηπ print ςηπ Point
cout << "; radius is " << getRadius();
}
}; // ςέλξπ ςηπ κλάρηπ Circle

class Cylinder : public Circle


{
private:
double height;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ


public:
Cylinder(int xValue, int yValue, double radiusValue, double
heightValue) : Circle(xValue, yValue, radiusValue)
{
setHeight(heightValue);
}
void setHeight(double heightValue)
{
height = ( heightValue < 0.0 ? 0.0 : heightValue );
}
double getHeight()
{
return height;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
// σπέοβαρη ςηπ εικξμικήπ ρσμάοςηρηπ getArea:
// επιρςοέτεςαι ςξ εμβαδόμ ςηπ Cylinder
double Cylinder::getArea()
{
return 2 * Circle::getArea() + getCircumference()
* getHeight();
}
// σπέοβαρη ςηπ εικξμικήπ ρσμάοςηρηπ getVolume:
// επιρςοέτεςαι ξ όγκξπ ςηπ Cylinder
double Cylinder::getVolume()
{
return Circle::getArea() * getHeight();
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ


virtual string getName() {
return "Cylinder";
}
virtual void print() {
Circle::print(); // επαμαυοηριμξπξίηρη κώδικα
cout << "; height is " << getHeight();
}
}; // ςέλξπ ςηπ Cylinder
// Κλήρη εικξμικώμ ρσμαοςήρεωμ μέρω δείκςη ρςη βαρική κλάρη
// με υοήρη δσμαμικήπ ρύμδερηπ (ιρξδύμαμη με ςημ επόμεμη ρσμάοςηρη)
void virtualViaPointer(Shape *baseClassPtr) {
cout << baseClassPtr->getName() << ": ";
baseClassPtr->print();
cout << "\narea is " << baseClassPtr->getArea()
<< "\nvolume is " << baseClassPtr->getVolume() << "\n\n";
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
// Κλήρη εικξμικώμ ρσμαοςήρεωμ κας' αματξοά ςηπ
// βαρικήπ κλάρηπ με υοήρη δσμαμικήπ ρύμδερηπ
// (ιρξδύμαμη με ςημ ποξηγξύμεμη ρσμάοςηρη)
void virtualViaReference(Shape &baseClassRef) {
cout << baseClassRef.getName() << ": ";
baseClassRef.print();
cout << "\narea is " << baseClassRef.getArea()
<< "\nvolume is " << baseClassRef.getVolume() << "\n\n";
}
main() {
int i,j;
cout << fixed << setprecision(2);
Point point( 7, 11 );
Circle circle( 22, 8, 3.5 );
Cylinder cylinder( 10, 10, 3.3, 10 );

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ


cout << point.getName() << ": "; // ρςαςική ρύμδερη
point.print(); // ρςαςική ρύμδερη
cout << '\n';
cout << circle.getName() << ": "; // ρςαςική ρύμδερη
circle.print(); // ρςαςική ρύμδερη
cout << '\n';
cout << cylinder.getName() << ": "; // ρςαςική ρύμδερη
cylinder.print(); // ρςαςική ρύμδερη
cout << "\n\n";
vector < Shape * > shapeVector(3);
// ξ shapeVector[0] δείυμει ρε αμςικείμεμξ ςηπ παοαγόμεμηπ
// κλάρηπ Point
shapeVector[ 0 ] = &point;
// ξ shapeVector[1] δείυμει ρε αμςικείμεμξ ςηπ παοαγόμεμηπ
// κλάρηπ Circle
shapeVector[ 1 ] = &circle;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ
// ξ shapeVector[2] δείυμει ρε αμςικείμεμξ ςηπ παοαγόμεμηπ
// κλάρηπ cylinder
shapeVector[ 2 ] = &cylinder;
// υοήρη δσμαμικήπ ρύμδερηπ
cout << "\nVirtual function calls made off
<< "base-class pointers:\n\n";
for (i=0;i<shapeVector.size();i++)
virtualViaPointer( shapeVector[ i ] );
cout < "\nVirtual function calls made off
<< "base-class references:\n\n";
for (j=0;j<shapeVector.size();j++)
virtualViaReference( *shapeVector[ j ] );
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ εικξμικώμ ρσμαοςήρεχμ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Δικξμικέπ ρσμαοςήρειπ απξδόμηρηπ
• Σςημ πεοίπςχρη πξσ υοηριμξπξιείςαι δείκςηπ βαρικήπ κλάρηπ ρε
αμςικείμεμξ ςηπ παοαγόμεμηπ κλάρηπ, εάμ καςαρςοέφξσμε ςξ αμςικείμεμξ με
ςημ delete η ρσμπεοιτξοά θα είμαι αποξρδιόοιρςη.

•Ωπ λύρη δίμξμςαι ξι εικξμικέπ ρσμαοςήρειπ απξδόμηρηπ (virtual


destructors): Δηλώμεςαι η ρσμάοςηρη απξδόμηρηπ ςηπ βαρικήπ κλάρηπ χπ
εικξμική, ξπόςε όςαμ καλείςαι η delete καλείςαι και η καςάλληλη ρσμάοςηρη
απξδόμηρηπ.

•Όςαμ καςαρςοέτξσμε έμα αμςικείμεμξ μιαπ παοαγόμεμηπ κλάρηπ ποώςα


εκςελείςαι η ρσμάοςηρη απξδόμηρηπ ςηπ παοάγχγηπ κλάρηπ και μεςά
εκςελείςαι η ρσμάοςηρη απξδόμηρηπ ςηπ βαρικήπ κλάρηπ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

• Ποόγοαμμα μιρθξδξρίαπ, όπξσ γίμεςαι υοήρη εικξμικώμ


ρσμαοςήρεχμ και πξλσμξοτιρμξύ.

• Ποόβλημα: 4 είδη εογαζξμέμχμ, ξι ξπξίξι αμείβξμςαι ρε


εβδξμαδιαία βάρη
• Salaried (μιρθόπ, αμεναοςήςα από ςιπ ώοεπ εογαρίαπ)
• Hourly (σπεοχοίεπ [>40 ώοεπ] + 50% ςξ χοξμίρθιξ)
• Commission (πξρξρςό επί ςχμ πχλήρεχμ)
• Base-plus-commission (βαρικόπ μιρθόπ + πξρξρςό επί
ςχμ πχλήρεχμ)
Deitel & Deitel: C++ Programming

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
• Bαρική κλάρη: Employee, η ξπξία είμαι γμήρια εικξμική ρσμάοςηρη.
• Παοαγόμεμεπ κλάρειπ από ςημ Employee:

Employee

SalariedEmployee CommissionEmployee HourlyEmployee

BasePlusCommissionEmployee

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ


1
2 // Βαζηθή θιάζε Employee
3 #ifndef EMPLOYEE_H
4 #define EMPLOYEE_H
5
6 #include <string> // C++ πρόησπε θιάζε string
7
8 using std::string;
9
10 class Employee {
11
12 public:
13 Employee(string &, string &, string &);
14
15 void setFirstName(string &);
16 string getFirstName();
17
18 void setLastName(string &);
19 string getLastName();
20
21 void setSocialSecurityNumber(string & );
22 string getSocialSecurityNumber();
23

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

24 // Η γλήζηα εηθοληθή ζσλάρηεζε θαζηζηά ηελ Employee βαζηθή θιάζε


25 virtual double earnings() = 0; // γλήζηα εηθοληθή
26 virtual void print(); // εηθοληθή
27
28 private:
29 string firstName;
30 string lastName;
31 string socialSecurityNumber;
32
33 };
34
35 #endif // EMPLOYEE_H

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ


1 // employee.cpp
2 // Ορηζκοί ηωλ ζσλαρηήζεωλ-κειώλ ηες βαζηθής θιάζες Employee
3 // ΣΗΜΕΙΩΣΗ: Δελ παρέτοληαη ορηζκοί γηα γλήζηες εηθοληθές ζσλαρηήζεης
4 #include <iostream>
5
6 using std::cout;
7 using std::endl;
8
9 #include "employee.h" // Ορηζκός ηες θιάζες Employee
10
11 // Σσλάρηεζε δόκεζες
12 Employee::Employee(string &first, string &last,
13 string &SSN )
14 : firstName( first ),
15 lastName( last ),
16 socialSecurityNumber( SSN )
17 {
18 // άδεηο ζώκα ζσλάρηεζες
19
20 }
21

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


22 // Επηζηρέθεηαη ηο όλοκα
23 string Employee::getFirstName()
24 {
25 return firstName;
26
27 }
28
29 // Επηζηρέθεηαη ηο επώλσκο
30 string Employee::getLastName()
31 {
32 return lastName;
33
34 }
35
36 // Επηζηρέθεηαη ο αρηζκός θοηλωληθής αζθάιηζες
37 string Employee::getSocialSecurityNumber()
38 {
39 return socialSecurityNumber;
40
41 }
42
43
44 void Employee::setFirstName(string &first)
45 {
46 firstName = first;
47
48 }
49

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

50
51 void Employee::setLastName(string &last)
52 {
53 lastName = last;
54
55 }
56
57
58 void Employee::setSocialSecurityNumber(string &number)
59 {
60 socialSecurityNumber = number;
61
62 }
63
64
65 void Employee::print() Ππόηςπη ςλοποίηζη για ηην
66 { εικονική ζςνάπηηζη print.
67 cout << getFirstName() << ' ' << getLastName()
68 << "\nsocial security number: "
69 << getSocialSecurityNumber() << endl;
70
71 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
1 // salaried.h
2 // Η θιάζε SalariedEmployee class απορρέεη από ηελ Employee.
3 #ifndef SALARIED_H
4 #define SALARIED_H
5
6 #include "employee.h"
7
8 class SalariedEmployee : public Employee {
9
10 public:
11 SalariedEmployee(string &, string &, Νέερ ζςναπηήζειρ για ηην
12 string &, double = 0.0 ); κλάζη SalariedEmployee.
13
14 void setWeeklySalary( double );
15 double getWeeklySalary(); Η earnings ςπεπβαίνεηαι. Η
16 print ςπεπβαίνεηαι για να
17
18
virtual double earnings();
virtual void print();
καθοπιζθεί όηι ηο ανηικείμενο
19 είναι salaried employee.
20 private:
21 double weeklySalary;
22
23 };
24
25 #endif

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ


1 // salaried.cpp
2 // Ορηζκοί ηωλ ζσλαρηήζεωλ-κέιος ηες θιάζες SalariedEmployee
3 #include <iostream>
4
5 using std::cout;
6
7 #include "salaried.h"
8
9 // Σσλάρηεζε δόκεζες ηες θιάζες SalariedEmployee
10 SalariedEmployee::SalariedEmployee(string &first,
11 string &last, string &socialSecurityNumber, Χπήζη ζςναπηήζεων δόμηζηρ
12 double salary ) ηηρ βαζικήρ κλάζηρ για ηα
13
βαζικά πεδία.
: Employee( first, last, socialSecurityNumber )
14 {
15 setWeeklySalary( salary );
16
17 }
18
19
20 void SalariedEmployee::setWeeklySalary( double salary )
21 {
22 weeklySalary = salary < 0.0 ? 0.0 : salary;
23
24 }
25

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
26
27 double SalariedEmployee::earnings()
28 {
29 return getWeeklySalary();
30
31 } Υλοποίηζη γνήζιων εικονικών
32 ζςναπηήζεων.
33
34 double SalariedEmployee::getWeeklySalary()
35 {
36 return weeklySalary;
37
38 }
39
40
41 void SalariedEmployee::print()
42 {
43 cout << "\nsalaried employee: ";
44 Employee::print(); // επαλατρεζηκοποίεζε θώδηθα
45
46 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // hourly.h
2
3 #ifndef HOURLY_H
4 #define HOURLY_H
5
6 #include "employee.h"
7
8 class HourlyEmployee : public Employee {
9
10 public:
11 HourlyEmployee( string &, string &,
12 string &, double = 0.0, double = 0.0 );
13
14 void setWage( double );
15 double getWage() const;
16
17 void setHours( double );
18 double getHours();
19
20 virtual double earnings();
21 virtual void print();
22
23 private:
24 double wage; // εκεροκίζζηο
25 double hours; // εβδοκαδηαίο ωράρηο
26
27 };
28
29 #endif

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
1 // hourly.cpp
2 // Ορηζκοί ηωλ ζσλαρηήζεωλ-κέιος ηες θιάζες HourlyEmployee
3 #include <iostream>
4
5 using std::cout;
6
7 #include "hourly.h"
8
9 // Σσλάρηεζε δόκεζες ηες θιάζες HourlyEmployee
10 HourlyEmployee::HourlyEmployee( string &first,
11 string &last, string &socialSecurityNumber,
12 double hourlyWage, double hoursWorked )
13 : Employee( first, last, socialSecurityNumber )
14 {
15 setWage( hourlyWage );
16 setHours( hoursWorked );
17
18 }
19
20
21 void HourlyEmployee::setWage( double wageAmount )
22 {
23 wage = wageAmount < 0.0 ? 0.0 : wageAmount;
24
25 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ


26
27
28 void HourlyEmployee::setHours( double hoursWorked )
29 {
30 hours = ( hoursWorked >= 0.0 && hoursWorked <= 168.0 ) ?
31 hoursWorked : 0.0;
32
33 }
34
35
36 double HourlyEmployee::getHours()
37 {
38 return hours;
39
40 }
41
42
43 double HourlyEmployee::getWage()
44 {
45 return wage;
46
47 }
48

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

49
50 double HourlyEmployee::earnings()
51 {
52 if ( hours <= 40 ) // δελ σπάρτοσλ σπερωρίες
53 return wage * hours;
54 else // ε σπερωρία ακείβεηαη 150% ηοσ εκεροκίζζηοσ
55 return 40 * wage + ( hours - 40 ) * wage * 1.5;
56
57 }
58
59
60 void HourlyEmployee::print()
61 {
62 cout << "\nhourly employee: ";
63 Employee::print(); // επαλατρεζηκοποίεζε θώδηθα
64
65 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // commission.h
2
3 #ifndef COMMISSION_H
4 #define COMMISSION_H
5
6 #include "employee.h"
7

Καθοπιζμόρ rate και sales.


8 class CommissionEmployee : public Employee {
9
10 public:
11 CommissionEmployee(string &, string &,
12 string &, double = 0.0, double = 0.0 );
13
14 void setCommissionRate( double );
15 double getCommissionRate();
16
17 void setGrossSales( double );
18 double getGrossSales();
19
20 virtual double earnings();
21 virtual void print();
22
23 private:
24 double grossSales; // εβδοκαδηαίος ηδίρος
25 double commissionRate; // ποζοζηό προκήζεηας
26
27 };
28
29 #endif

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
1 // commission.cpp
2 // Ορηζκοί ηωλ ζσλαρηήζεωλ-κέιος ηες θιάζες CommissionEmployee
3 #include <iostream>
4
5 using std::cout;
6
7 #include "commission.h"
8
9 // Σσλάρηεζε δόκεζες ηες θιάζες CommissionEmployee
10 CommissionEmployee::CommissionEmployee(string &first,
11 string &last, string &socialSecurityNumber,
12 double grossWeeklySales, double percent )
13 : Employee( first, last, socialSecurityNumber )
14 {
15 setGrossSales( grossWeeklySales );
16 setCommissionRate( percent );
17
18 }
19
20
21 double CommissionEmployee::getCommissionRate()
22 {
23 return commissionRate;
24
25 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ


26
27
28 double CommissionEmployee::getGrossSales()
29 {
30 return grossSales;
31
32 } //
33
34
35 void CommissionEmployee::setGrossSales( double sales )
36 {
37 grossSales = sales < 0.0 ? 0.0 : sales;
38
39 }
40
41
42 void CommissionEmployee::setCommissionRate( double rate )
43 {
44 commissionRate = ( rate > 0.0 && rate < 1.0 ) ? rate : 0.0;
45
46 }
47

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

48
49 double CommissionEmployee::earnings()
50 {
51 return getCommissionRate() * getGrossSales();
52
53 }
54
55
56 void CommissionEmployee::print()
57 {
58 cout << "\ncommission employee: ";
59 Employee::print(); // επαλατρεζηκοποίεζε θώδηθα
60
61 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ


1 // baseplus.h Κληπονομεί από ηην κλάζη
2 // Η θιάζε BasePlusCommissionEmployee απορρέεη από ηελ θιάζε Employee
3 #ifndef BASEPLUS_H
CommissionEmployee (και
4 #define BASEPLUS_H έμμεζα από ηην κλάζη
5 Employee).
6 #include "commission.h"
7
8 class BasePlusCommissionEmployee : public CommissionEmployee {
9
10 public:
11 BasePlusCommissionEmployee(string &, string &,
12 string &, double = 0.0, double = 0.0, double = 0.0 );
13
14 void setBaseSalary( double );
15 double getBaseSalary();
16
17 virtual double earnings();
18 virtual void print();
19
20 private:
21 double baseSalary; // βαζηθός εβδοκαδηαίος κηζζός
22
23 };
24
25 #endif

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


1 // baseplus.cpp
2 // Ορηζκοί ηωλ ζσλαρηήζεωλ-κέιος ηες θιάζες BasePlusCommissionEmployee
3 #include <iostream>
4
5 using std::cout;
6
7 #include "baseplus.h"
8
9 // Σσλάρηεζε δόκεζες γηα ηελ θιάζε BasePlusCommissionEmployee
10 BasePlusCommissionEmployee::BasePlusCommissionEmployee(
11 string &first, string &last,
12 const string &socialSecurityNumber,
13 double grossSalesAmount, double rate,
14 double baseSalaryAmount )
15 : CommissionEmployee( first, last, socialSecurityNumber,
16 grossSalesAmount, rate )
17 {
18 setBaseSalary( baseSalaryAmount );
19
20 }
21
22
23 void BasePlusCommissionEmployee::setBaseSalary( double salary )
24 {
25 baseSalary = salary < 0.0 ? 0.0 : salary;
26
27 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

28
29
30 double BasePlusCommissionEmployee::getBaseSalary()
31 {
32 return baseSalary;
33
34 }
35
36
37 double BasePlusCommissionEmployee::earnings()
38 {
39 return getBaseSalary() + CommissionEmployee::earnings();
40
41 }
42
43
44 void BasePlusCommissionEmployee::print()
45 {
46 cout << "\nbase-salaried commission employee: ";
47 Employee::print(); // επαλατρεζηκοποίεζε θώδηθα
48
49 }

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
1 // fig10_33.cpp
2 // Ιεραρτία ηες θιάζες Employee
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7 using std::fixed;
8
9 #include <iomanip>
10
11 using std::setprecision;
12
13 #include <vector>
14
15 using std::vector;
16
17 #include <typeinfo>
18
19 #include "employee.h" // Βαζηθή θιάζε Employee
20 #include "salaried.h" // Κιάζε SalariedEmployee
21 #include "commission.h" // Κιάζε CommissionEmployee
22 #include "baseplus.h" // Κιάζε BasePlusCommissionEmployee
23 #include "hourly.h" // Κιάζε HourlyEmployee
24

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

25 int main()
26 {
27
28 cout << fixed << setprecision( 2 );
29
30
31 vector < Employee * > employees( 4 );
32
33
34 employees[ 0 ] = new SalariedEmployee( "John", "Smith",
35 "111-11-1111", 800.00 );
36 employees[ 1 ] = new CommissionEmployee( "Sue", "Jones",
37 "222-22-2222", 10000, .06 );
38 employees[ 2 ] = new BasePlusCommissionEmployee( "Bob",
39 "Lewis", "333-33-3333", 300, 5000, .04 );
40 employees[ 3 ] = new HourlyEmployee( "Karen", "Price",
41 "444-44-4444", 16.75, 40 );
42

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


43
44 for ( int i = 0; i < employees.size(); i++ ) {
Χπήζη downcasting. Εάν «δείσνει» ζηον
45 ζωζηό ηύπο ανηικειμένος, ο δείκηηρ είναι
46
47 employees[ i ]->print();
μη μηδενικόρ. Έηζι δίνεηαι αύξηζη μόνο
48 ζε BasePlusCommissionEmployees.
49
50 BasePlusCommissionEmployee *commissionPtr =
51 dynamic_cast < BasePlusCommissionEmployee * >
52 ( employees[ i ] );
53
54
55
56 if ( commissionPtr != 0 ) {
57 cout << "old base salary: $"
58 << commissionPtr->getBaseSalary() << endl;
59 commissionPtr->setBaseSalary(
60 1.10 * commissionPtr->getBaseSalary() );
61 cout << "new base salary with 10% increase is: $"
62 << commissionPtr->getBaseSalary() << endl;
63
64 }
65
66 cout << "earned $" << employees[ i ]->earnings() << endl;
67
68 }
69

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ

70 // απειεσζέρωζε κλήκες
71 for ( int j = 0; j < employees.size(); j++ ) {
72
73
74 cout << "\ndeleting object of "
75 << typeid( *employees[ j ] ).name();
76
77 delete employees[ j ];
78
79 } Η typeid επιζηπέθει ένα
80 ανηικείμενο ηύπος type_info, ηο
81 cout << endl;
οποίο πεπιέσει πληποθοπίερ για ηον
82
83 return 0;
ηελεζηή, ζςμπεπιλαμβανομένος ηος
84 ονόμαηόρ ηος.
85 } // ηέιος ηες main

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Μελέςη πεοίπςχρηπ πξλσμξοτιρμξύ
salaried employee: John Smith
social security number: 111-11-1111
earned $800.00

commission employee: Sue Jones


social security number: 222-22-2222
earned $600.00

base-salaried commission employee: Bob Lewis


social security number: 333-33-3333
old base salary: $300.00
new base salary with 10% increase is: $330.00
earned $530.00

hourly employee: Karen Price


social security number: 444-44-4444
earned $670.00

deleting object of class SalariedEmployee


deleting object of class CommissionEmployee
deleting object of class BasePlusCommissionEmployee
deleting object of class HourlyEmployee

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Ενότητα

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Περιεχόμενα ενότητασ
1. Η ΚΛΑΣΗ string
2. ΜΕΘΟΔΟΙ ΢ΣΗ ΚΛΑ΢Η string
3. ΣΕΛΕ΢ΣΕ΢ ΢ΣΗ ΚΛΑ΢Η string
4. ΠΑΡΑΔΕΙΓΜΑΣΑ ΜΕ ΣΕΛΕ΢ΣΕ΢ ΢ΣΗ ΚΛΑ΢Η string
5. ΕΙ΢ΟΔΟ΢ / ΕΞΟΔΟ΢ ΔΕΔΟΜΕΝΩΝ
6. ΚΛΑ΢ΕΙ΢ ΓΙΑ ΕΙ΢ΟΔΟ / ΕΞΟΔΟ ΑΠΟ ΑΡΥΕΙΑ
7. ΕΛΕΓΥΟΙ ΢Ε ΑΡΥΕΙΑ
8. ΕΞΟΔΟ΢ ΢Ε ΑΡΥΕΙΟ
9. ΕΙ΢ΟΔΟ΢ ΑΠΟ ΑΡΥΕΙΟ
10. ΔΕΙΚΣΕ΢ ΡΟΗ΢ get, put
11. ΜΕΘΟΔΟΙ ΢Ε ΡΟΕ΢
ΕΙ΢ΟΔΟΤ / ΕΞΟΔΟΤ
12. ΜΕΘΟΔΟΙ ΓΙΑ ΕΙ΢ΟΔΟ/ΕΞΟΔΟ ΑΠΟ BINARY ΑΡΥΕΙΟ

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Η ΚΛΑΣΗ string

#include <string>
using namespace std;

void main() {
string first_name = "Bjarne";
string last_name;
last_name = "Stroustrup";
string names = first_name + " " + last_name;
cout << names << endl;
names = last_name + ", " + first_name;
cout << names << endl;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΜΕΘΟΔΟΙ ΢ΣΗ ΚΛΑ΢Η string
len, size
string str = "Hello";
string::size_type len;
len = str.length(); // len == 5
len = str.size(); // len == 5

c_str // Μεςαςοξπή ρε ρσμβξλξρειοά ςηπ C


string filename;
cout << "Enter file name: ";
cin >> filename;
ofstream outfile (filename.c_str());
outfile << "Data" << endl;
insert
string str11 = "abcdefghi";
string str12 = "0123";
str11.insert (3,str12);
cout << str11 << endl; // "abc0123defghi"
str12.insert (1,"XYZ");
cout << str12 << endl; // "0XYZ123"

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΜΕΘΟΔΟΙ ΢ΣΗ ΚΛΑ΢Η string


erase
string str13 = "abcdefghi";
str12.erase (5,3);
cout << str12 << endl; // "abcdei"

replace
string str14 = "abcdefghi";
string str15 = "XYZ";
str14.replace (4,2,str15);
cout << str14 << endl; // "abcdXYZghi"

find, rfind (find βοίρκει ςημ ποώςη θέρη, rfind βοίρκει ςημ ςελεσςαία
string str16 = "abcdefghi";
string str17 = "def";
string::size_type pos = str16.find (str17,0);
cout << pos << endl; // 3
pos = str16.find ("AB",0);
if (pos == string::npos) // string::npos – ειδικόπ υαοακςήοαπ ρε πεοίπςωρη
// απξςσυίαπ ςηπ μεθόδξσ
cout << "Not found" << endl;

substr
string str18 = "abcdefghi“;
string str19 = str18.substr (6,2);
cout << str19 << endl; // "gh"

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΣΕΛΕ΢ΣΕ΢ ΢ΣΗ ΚΛΑ΢Η string
Οι τελεστές ποσ τρησιμοποιούνται σε
αντικείμενα της κλάσης string είναι:

=, +, +=, !=, <, >, <=, >=, <<, >>

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΠΑΡΑΔΕΙΓΜΑΣΑ ΜΕ ΣΕΛΕ΢ΣΕ΢ ΢ΣΗ


ΚΛΑ΢Η string
string str1 = "Hello ";
string str2 = "there";
string str3 = str1 + str2; // "Hello there"

string str1 = "Hello ";


str1 += "there"; // Hello there

str1 < str2;

string str1 = "Hello there";


cout << str1 << endl;

string str1;
cin >> str1;

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΕΙ΢ΟΔΟ΢ / ΕΞΟΔΟ΢ ΔΕΔΟΜΕΝΩΝ
• Όςαμ θέλξσμε μα διαβάρξσμε / απξθηκεύρξσμε /
ςσπώρξσμε από/ποξπ stdin / stdout ή ρε αουεία ξι
βιβλιξθήκεπ πξσ ποέπει μα ειράγξσμε είμαι ξι :

• #include<iostream>
– Βιβλιξθήκη για είρξδξ / ένξδξ.

• #include<iomanip>
– Βιβλιξθήκη για C++ manipulators. Γεμικά υοήριμη βιβλιξθήκη.

• #include<fstream>
– Βιβλιξθήκη για είρξδξ / ένξδξ με υοήρη αουείωμ.

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΚΛΑ΢ΕΙ΢ ΓΙΑ ΕΙ΢ΟΔΟ / ΕΞΟΔΟ ΑΠΟ


ΑΡΥΕΙΑ
• ofstream: Κλάρη για ένξδξ δεδξμέμωμ ρε αουείξ
• ifstream: Κλάρη για διάβαρμα από αουείξ
• fstream: Κλάρη για διάβαρμα και ένξδξ δεδξμέμωμ ρε
αουείξ
• Για μα αμξίνξσμε έμα αουείξ (για είρξδξ ή ένξδξ)
υοηριμξπξιξύμε ςημ εμςξλή

void open (const char * filename, openmode1 | openmode2 | .. openmodek);

openmode: ios::in, ios::out, ios::ate, ios::trunc, ios::app, ios::binary

Παοάδειγμα:

ofstream file ("example.bin", ios::out | ios::app | ios::binary);

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΕΛΕΓΥΟΙ ΢Ε ΑΡΥΕΙΑ
• Μπξοξύμε μα ελέγνξσμε εάμ έμα αουείξ έυει
αμξίνει ρωρςά με ςημ μέθξδξ is_open()
• Κλείμξσμε έμα αουείξ με ςη μέθξδξ close()
• Όςαμ έυξσμε αουεία κειμέμξσ (text files) ςόςε
μπξοξύμε μα υοηριμξπξιξύμε ςιπ ίδιεπ μεθόδξσπ
με ςα cin, cout όπωπ και όςαμ έυξσμε
είρξδξ/ένξδξ από ςξ πληκςοξλόγιξ (είρξδξ), ή
ςημ ξθόμη (ένξδξ).

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΕΞΟΔΟ΢ ΢Ε ΑΡΥΕΙΟ
// Ένξδξπ δεδξμέμωμ ρε αοχείξ
#include <fstream.h> Μιας και δεν δίνουμε openmode,
tο openmode εδώ είναι από
int main () { default ios::out | ios::trunc
ofstream examplefile ("example.txt");

if (examplefile.is_open()) {
examplefile << "This is a line.\n";
examplefile << "This is another line.\n";
Το αρτείο example.txt
examplefile.close();
θα περιέτει:
}
return 0; This is a line.
This is another line.
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΕΙ΢ΟΔΟ΢ ΑΠΟ ΑΡΥΕΙΟ
// Είρξδξπ από αοχείξ κειμέμξσ

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

int main () {
char buffer[256];
ifstream examplefile ("example.txt");

if (! examplefile.is_open()) {
cout << "Error opening file";
exit (1);
} Στην οθόνη τσπώνεται:

while (! examplefile.eof() ) { This is a line.


examplefile.getline (buffer,100);
cout << buffer << endl; This is another line.
}
return 0;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΔΕΙΚΣΕ΢ ΡΟΗ΢ get, put


• Ο δείκςηπ οξήπ είμαι ςξ απξςέλερμα ςηπ κλήρηπ
ςωμ constructors istream, ifstream, ostream,
ofstream.
• Όςαμ μιλάμε για είρξδξ ςόςε ξ δείκςηπ ξμξμάζεςαι
get input stream, εμώ όςαμ έυξσμε μα κάμξσμε με
ένξδξ ξμξμάζεςαι put input stream.
• Υπάουξσμ μεοικέπ ρσμαοςήρειπ βιβλιξθήκηπ πξσ
εταομόζξμςαι ρσυμά ρςιπ δύξ ασςέπ οξέπ
(ειρόδξσ, ενόδξσ)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΜΕΘΟΔΟΙ ΢Ε ΡΟΕ΢
ΕΙ΢ΟΔΟΤ / ΕΞΟΔΟΤ
• tellg() (για get δείκςη) και tellp() (για put δείκςη)
Επιρςοέτξσμ ςημ θέρη πξσ βοιρκόμαρςε ρςξ αουείξ

seekg() and seekp() (Καςάλληλεπ για υοήρη με αουεία κειμέμξσ)


Επιςοέπξσμ ςημ αλλαγή ςηπ θέρηπ πξσ βοιρκόμαρςε ρςξ αουείξ

• seekg ( pos_type_position );
seekp ( pos_type_position );
Αλλάζξσμ ςη θέρη πξσ βοιρκόμαρςε ρςξ αουείξ καςά ρςαθεοό βήμα ίρξ με ςημ ςιμή
pos_type_position και ρε ρυέρη με ςημ αουή ςξσ αουείξσ

• seekg ( off_type_offset, seekdir_direction );


seekp ( off_type_offset, seekdir_direction );
Αλλάζξσμ ςη θέρη πξσ βοιρκόμαρςε ρςξ αουείξ ίρξ με ςημ ςιμή
offset και ρε ρυέρη με ςo ρημείξ πξσ πεοιγοάτει η παοάμεςοξπ seekdir_direction
Oι ςιμέπ ςηπ παοαμέςοξσ seekdir_direction μπξοεί μα είμαι:
ios::beg (αουή ςξσ αουείξσ)
ios::cur (ςοέυωμ ρημείξ)
ios::end (ςέλξπ ςξσ αουείξσ)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΠΑΡΑΔΕΙΓΜΑ
// Υπξλξγιρμόπ μεγέθξσπ binary αοχείξσ

#include <iostream.h> Στην οθόνη τσπώνεται:


#include <fstream.h>
const char * filename = "example.txt";
size of example.txt is 40 bytes.
int main () {
long l, m;
ifstream file (filename, ios::in | ios::binary);

l = file.tellg();
file.seekg (0, ios::end);
m = file.tellg();
file.close();
cout << "size of " << filename; cout << " is " << (m-l) << " bytes.\n";
return 0;
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


ΜΕΘΟΔΟΙ ΓΙΑ ΕΙ΢ΟΔΟ/ΕΞΟΔΟ ΑΠΟ
BINARY ΑΡΥΕΙΟ
• write ( char * buffer, streamsize size );
Γοάτει από ςη ρσμβξλξρειοά buffer ςόρα
bytes όρα ξοίζξμςαι από ςη παοάμεςοξ
size

• read ( char * buffer, streamsize size );


Διαβάζει από ςξ αουείξ ςόρα
bytes όρα ξοίζξμςαι από ςη παοάμεςοξ
size και απξθέςει ρςη ρσμβξλξρειοά buffer

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

ΠΑΡΑΔΕΙΓΜΑ
// Είρξδξπ από binary αοχείξ
#include <iostream.h>
#include <fstream.h>

const char * filename = "example.txt";

int main () {
char * buffer;
long size;
ifstream file (filename, ios::in | ios::binary I ιos::ate);

size = file.tellg();
file.seekg (0, ios::beg);
buffer = new char [size];
file.read (buffer, size);
file.close();
cout << "the complete file is in a buffer"; Στην οθόνη τσπώνεται:
delete [] buffer;
return 0; the complete file is in a buffer
}

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Ενότητα 14

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

ΔΙΔΑ΢ΚΩΝ: ΠΑΡΙ΢ ΜΑ΢ΣΟΡΟΚΩ΢ΣΑ΢

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Περιεχόμενα ενότητασ
14.1 Introduction
14.2 The Data Hierarchy
14.3 Files and Streams
14.4 Creating a Sequential-Access File
14.5 Reading Data from a Sequential-Access File
14.6 Updating Sequential-Access Files
14.7 Random-Access Files
14.8 Creating a Random-Access File
14.9 Writing Data Randomly to a Random-Access File
14.10 Reading Data Sequentially from a Random-
Access File
14.11 Example: A Transaction-Processing Program
14.12 Input/Output of Objects

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.1 Introduction

• Storage of data
– Arrays, variables are temporary
– Files are permanent
• Magnetic disk, optical disk, tapes
• In this chapter
– Create, update, process files
– Sequential and random access
– Formatted and raw processing

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.2 The Data Hierarchy

• From smallest to largest


– Bit (binary digit)
• 1 or 0
• Everything in computer ultimately represented as bits
• Cumbersome for humans to use
• Character set
– Digits, letters, symbols used to represent data
– Every character represented by 1's and 0's
– Byte: 8 bits
• Can store a character (char)
• Also Unicode for large character sets (wchar_t)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.2 The Data Hierarchy

• From smallest to largest (continued)


– Field: group of characters with some meaning
• Your name
– Record: group of related fields
• struct or class in C++
• In payroll system, could be name, SS#, address, wage
• Each field associated with same employee
• Record key: field used to uniquely identify record
– File: group of related records
• Payroll for entire company
• Sequential file: records stored by key
– Database: group of related files
• Payroll, accounts-receivable, inventory…
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.2 The Data Hierarchy

Sally Black
Tom Blue
Judy Green File
Iris Orange
Randy Red

Judy Green Record


Judy Field
01001010 Byte (ASCII character J)

1 Bit

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.3 Files and Streams

• C++ views file as sequence of bytes


– Ends with end-of-file marker
0 1 2 3 4 5 6 7 8 9 ... n-1
... end-of-file marker

• When file opened


– Object created, stream associated with it
– cin, cout, etc. created when <iostream> included
• Communication between program and file/device

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.3 Files and Streams

• To perform file processing


– Include <iostream> and <fstream>
– Class templates
• basic_ifstream (input)
• basic_ofstream (output)
• basic_fstream (I/O)
– typedefs for specializations that allow char I/O
• ifstream (char input)
• ofstream (char output)
• fstream (char I/O)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.3 Files and Streams

• Opening files
– Create objects from template
– Derive from stream classes
• Can use stream methods from Ch. 12
• put, get, peek, etc.

basic_ios

basic_istream basic_ostream

basic_ifstream basic_iostream basic_ofstream

basic_fstream

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.4 Creating a Sequential-Access File

• C++ imposes no structure on file


– Concept of "record" must be implemented by programmer
• To open file, create objects
– Creates "line of communication" from object to file
– Classes
• ifstream (input only)
• ofstream (output only)
• fstream (I/O)
– Constructors take file name and file-open mode
ofstream outClientFile( "filename", fileOpenMode );
– To attach a file later
Ofstream outClientFile;
outClientFile.open( "filename", fileOpenMode);

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.4 Creating a Sequential-Access File

• File-open modes
Mode Description

ios::app Write all output to the end of the file.


ios::ate Open a file for output and move to the end of the
file (normally used to append data to a file).
Data can be written anywhere in the file.
ios::in Open a file for input.
ios::out Open a file for output.
ios::trunc Discard the file’s contents if it exists (this is
also the default action for ios::out)
ios::binary Open a file for binary (i.e., non-text) input or
output.

– ofstream opened for output by default


• ofstream outClientFile( "clients.dat", ios::out );
• ofstream outClientFile( "clients.dat");

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.4 Creating a Sequential-Access File

• Operations
– Overloaded operator!
• !outClientFile
• Returns nonzero (true) if badbit or failbit set
– Opened non-existent file for reading, wrong permissions
– Overloaded operator void*
• Converts stream object to pointer
• 0 when when failbit or badbit set, otherwise nonzero
– failbit set when EOF found
• while ( cin >> myVariable )
– Implicitly converts cin to pointer
– Loops until EOF

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.4 Creating a Sequential-Access File

• Operations
– Writing to file (just like cout)
• outClientFile << myVariable
– Closing file
• outClientFile.close()
• Automatically closed when destructor called

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // Fig. 14.4: fig14_04.cpp


2 // Create a sequential file.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::ios; Notice the the header files
8
9
using
using
std::cerr;
std::endl;
required for file I/O.
10
11 #include <fstream>
ofstream object created
12
13 using std::ofstream; and used to open file
14
15 #include <cstdlib> // exit prototype "clients.dat". If the file
16
17 int main()
does not exist, it is created.
18 {
19 // ofstream constructor opens file
20 ofstream outClientFile( "clients.dat", ios::out ); ! operator used to test if the
21
22 // exit program if unable to create file file opened properly.
23 if ( !outClientFile ) { // overloaded ! operator
24 cerr << "File could not be opened" << endl;
25 exit( 1 ); fig14_04.cpp
26
27 } // end if (1 of 2)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


28
29 cout << "Enter the account, name, and balance." << endl
30 << "Enter end-of-file tocin
end is
input.\n?
implicitly";
converted to
31
a pointer. When EOF is
32 int account;
33 char name[ 30 ];
encountered, it returns 0 and
34 double balance; the loop stops.
35
36 // read account, name and balance from cin, then place in file
37 while ( cin >> account >> name >> balance ) {
38 outClientFile << account << ' ' << name << ' ' << balance
39 << endl;
40 cout << "? ";
41 Write data to file like a
42 } // end while
regular stream.
43
44 return 0; // ofstream destructor closes file
45 fig14_04.cpp
File closed when destructor called for (2 of 2)
46 } // end main
object. Can be explicitly closed with
close().

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Enter the account, name, and balance.


Enter end-of-file to end input.
? 100 Jones 24.98
? 200 Doe 345.67
? 300 White 0.00
? 400 Stone -42.16
? 500 Rich 224.62 fig14_04.cpp
? ^Z output (1 of 1)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.5 Reading Data from a Sequential-
Access File
• Reading files
– ifstream inClientFile( "filename", ios::in );
– Overloaded !
• !inClientFile tests if file was opened properly
– operator void* converts to pointer
• while (inClientFile >> myVariable)
• Stops when EOF found (gets value 0)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // Fig. 14.7: fig14_07.cpp


2 // Reading and printing a sequential file.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::ios;
8 using std::cerr;
9 using std::endl;
10 using std::left;
11 using std::right;
12 using std::fixed;
13 using std::showpoint;
14
15 #include <fstream>
16
17 using std::ifstream;
18
19 #include <iomanip>
20
21 using std::setw;
22 using std::setprecision;
23
24 #include <cstdlib> // exit prototype
25
26 void outputLine( int, const char * const, double );
fig14_07.cpp
27 (1 of 3)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


28 int main()
29 { Open and test file for input.
30 // ifstream constructor opens the file
31 ifstream inClientFile( "clients.dat", ios::in );
32
33 // exit program if ifstream could not open file
34 if ( !inClientFile ) {
35 cerr << "File could not be opened" << endl;
36 exit( 1 );
37
38 } // end if
39
40 int account;
41 char name[ 30 ];
42 double balance;
43
44 cout << left << setw( 10 ) << "Account" << setw( 13 )
45
Read from file until EOF
<< "Name" << "Balance" << endl << fixed << showpoint;
46 found.
47 // display each record in file
48 while ( inClientFile >> account >> name >> balance )
49 outputLine( account, name, balance );
50
51 return 0; // ifstream destructor closes the file fig14_07.cpp
52
53 } // end main (2 of 3)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

54
55 // display single record from file
56 void outputLine( int account, const char * const name,
57 double balance )
58 {
59 cout << left << setw( 10 ) << account << setw( 13 ) << name
60 << setw( 7 ) << setprecision( 2 ) << right << balance
61 << endl;
62
63 } // end function outputLine

Account Name Balance


100 Jones 24.98 fig14_07.cpp
200 Doe 345.67 (3 of 3)
300 White 0.00
400 Stone -42.16 fig14_07.cpp
500 Rich 224.62 output (1 of 1)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.5 Reading Data from a Sequential-
Access File
• File position pointers
– Number of next byte to read/write
– Functions to reposition pointer
• seekg (seek get for istream class)
• seekp (seek put for ostream class)
• Classes have "get" and "put" pointers
– seekg and seekp take offset and direction
• Offset: number of bytes relative to direction
• Direction (ios::beg default)
– ios::beg - relative to beginning of stream
– ios::cur - relative to current position
– ios::end - relative to end

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.5 Reading Data from a Sequential-


Access File
• Examples
– fileObject.seekg(0)
• Goes to front of file (location 0) because ios::beg is default
– fileObject.seekg(n)
• Goes to nth byte from beginning
– fileObject.seekg(n, ios::cur)
• Goes n bytes forward
– fileObject.seekg(y, ios::end)
• Goes y bytes back from end
– fileObject.seekg(0, ios::cur)
• Goes to last byte
– seekp similar

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.5 Reading Data from a Sequential-
Access File
• To find pointer location
– tellg and tellp
– location = fileObject.tellg()
• Upcoming example
– Credit manager program
– List accounts with zero balance, credit, and debit

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // Fig. 14.8: fig14_08.cpp


2 // Credit-inquiry program.
3 #include <iostream>
4
5 using std::cout;
6 using std::cin;
7 using std::ios;
8 using std::cerr;
9 using std::endl;
10 using std::fixed;
11 using std::showpoint;
12 using std::left;
13 using std::right;
14
15 #include <fstream>
16
17 using std::ifstream;
18
19 #include <iomanip>
20
21 using std::setw;
22 using std::setprecision;
23 fig14_08.cpp
24 #include <cstdlib> (1 of 6)
25

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


26 enum RequestType { ZERO_BALANCE = 1, CREDIT_BALANCE,
27 DEBIT_BALANCE, END };
28 int getRequest();
29 bool shouldDisplay( int, double );
30 void outputLine( int, const char * const, double );
31
32 int main()
33 {
34 // ifstream constructor opens the file
35 ifstream inClientFile( "clients.dat", ios::in );
36
37 // exit program if ifstream could not open file
38 if ( !inClientFile ) {
39 cerr << "File could not be opened" << endl;
40 exit( 1 );
41
42 } // end if
43
44 int request;
45 int account;
46 char name[ 30 ];
47 double balance;
48
49 // get user's request (e.g., zero, credit or debit balance) fig14_08.cpp
50 request = getRequest();
(2 of 6)
51

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

52 // process user's request


53 while ( request != END ) {
54
55 switch ( request ) {
56
57 case ZERO_BALANCE:
58 cout << "\nAccounts with zero balances:\n";
59 break;
60
61 case CREDIT_BALANCE:
62 cout << "\nAccounts with credit balances:\n";
63 break;
64
65 case DEBIT_BALANCE:
66 cout << "\nAccounts with debit balances:\n";
67 break;
68 fig14_08.cpp
69 } // end switch
(3 of 6)
70

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


71 // read account, name and balance from file
72 inClientFile >> account >> name >> balance;
73
74 // display file contents (until eof)
75 while ( !inClientFile.eof() ) {
76
77 // display record
78 if ( shouldDisplay( request, balance ) )
79 outputLine( account, name, balance );
80
81 // read account, name and balance from file
82 inClientFile >> account >> name >> balance; Use clear to reset eof. Use
83 seekg to set file position
84 } // end inner while
85 pointer to beginning of file.
86 inClientFile.clear(); // reset eof for next input
87 inClientFile.seekg( 0 ); // move to beginning of file
88 request = getRequest(); // get additional request from user
89
90 } // end outer while
91
92 cout << "End of run." << endl;
93
94 return 0; // ifstream destructor closes the file
95
fig14_08.cpp
96 } // end main (4 of 6)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

97
98 // obtain request from user
99 int getRequest()
100 {
101 int request;
102
103 // display request options
104 cout << "\nEnter request" << endl
105 << " 1 - List accounts with zero balances" << endl
106 << " 2 - List accounts with credit balances" << endl
107 << " 3 - List accounts with debit balances" << endl
108 << " 4 - End of run" << fixed << showpoint;
109
110 // input user request
111 do {
112 cout << "\n? ";
113 cin >> request;
114
115 } while ( request < ZERO_BALANCE && request > END );
116
117 return request;
118 fig14_08.cpp
119 } // end function getRequest
120 (5 of 6)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


121 // determine whether to display given record
122 bool shouldDisplay( int type, double balance )
123 {
124 // determine whether to display credit balances
125 if ( type == CREDIT_BALANCE && balance < 0 )
126 return true;
127
128 // determine whether to display debit balances
129 if ( type == DEBIT_BALANCE && balance > 0 )
130 return true;
131
132 // determine whether to display zero balances
133 if ( type == ZERO_BALANCE && balance == 0 )
134 return true;
135
136 return false;
137
138 } // end function shouldDisplay
139
140 // display single record from file
141 void outputLine( int account, const char * const name,
142 double balance )
143 {
144 cout << left << setw( 10 ) << account << setw( 13 ) << name
145 << setw( 7 ) << setprecision( 2 ) << right << balance
146 << endl; fig14_08.cpp
147
148 } // end function outputLine
(6 of 6)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Enter request
1 - List accounts with zero balances
2 - List accounts with credit balances
3 - List accounts with debit balances
4 - End of run
? 1

Accounts with zero balances:


300 White 0.00

Enter request
1 - List accounts with zero balances
2 - List accounts with credit balances
3 - List accounts with debit balances
4 - End of run
? 2
Accounts with credit balances: fig14_08.cpp
400 Stone -42.16 output (1 of 2)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Enter request
1 - List accounts with zero balances
2 - List accounts with credit balances
3 - List accounts with debit balances
4 - End of run
? 3

Accounts with debit balances:


100 Jones 24.98
200 Doe 345.67
500 Rich 224.62

Enter request
1 - List accounts with zero balances
2 - List accounts with credit balances
3 - List accounts with debit balances
4 - End of run
? 4 fig14_08.cpp
End of run. output (2 of 2)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.6 Updating Sequential-Access Files

• Updating sequential files


– Risk overwriting other data
– Example: change name "White" to "Worthington"
• Old data
300 White 0.00 400 Jones 32.87

• Insert new data


300 Worthington 0.00

300 White 0.00 400 Jones 32.87


Data gets overwritten

300 Worthington 0.00ones 32.87

– Formatted text different from internal representation


– Problem can be avoided, but awkward
ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ
14.7 Random-Access Files

• Instant access
– Want to locate record quickly
• Airline reservations, ATMs
– Sequential files must search through each one
• Random-access files are solution
– Instant access
– Insert record without destroying other data
– Update/delete items without changing other data

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.7 Random-Access Files

• C++ imposes no structure on files


– Programmer must create random-access files
– Simplest way: fixed-length records
• Calculate position in file from record size and key

0 100 200 300 400 500

} byte offsets
}
}
}
}
}
}

100 100 100 100 100 100


bytes bytes bytes bytes bytes bytes

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.8 Creating a Random-Access File

• "1234567" (char *) vs 1234567 (int)


– char * takes 8 bytes (1 for each character + null)
– int takes fixed number of bytes (perhaps 4)
• 123 same size in bytes as 1234567
• << operator and write()
– outFile << number
• Outputs number (int) as a char *
• Variable number of bytes
– outFile.write( const char *, size );
• Outputs raw bytes
• Takes pointer to memory location, number of bytes to write
– Copies data directly from memory into file
– Does not convert to char *

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.8 Creating a Random-Access File

• Example
outFile.write( reinterpret_cast<const char *>(&number),
sizeof( number ) );
– &number is an int *
• Convert to const char * with reinterpret_cast
– sizeof(number)
• Size of number (an int) in bytes
– read function similar (more later)
– Must use write/read between compatible machines
• Only when using raw, unformatted data
– Use ios::binary for raw writes/reads

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.8 Creating a Random-Access File

• Usually write entire struct or object to file


• Problem statement
– Credit processing program
– Store at most 100 fixed-length records
– Record
• Account number (key)
• First and last name
• Balance
– Account operations
• Update, create new, delete, list all accounts in a file
• Next: program to create blank 100-record file

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // Fig. 14.10: clientData.h


2 // Class ClientData definition used in Fig. 14.12–Fig. 14.15.
3 #ifndef CLIENTDATA_H
4 #define CLIENTDATA_H
Class ClientData stores
5 the information for each
6 #include <iostream>
7
person. 100 blank
8 using std::string; ClientData objects will be
9
10 class ClientData {
written to a file.
11
12 public:
13
14 // default ClientData constructor
15 ClientData( int = 0, string = "", string = "", double = 0.0 );
16
17 // accessor functions for accountNumber
18 void setAccountNumber( int );
19 int getAccountNumber() const;
20
21 // accessor functions for lastName
22 void setLastName( string ); clientData.h
23 string getLastName() const;
24 (1 of 2)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


25 // accessor functions for firstName
26 void setFirstName( string );
27 string getFirstName() const;
28
29 // accessor functions for balance
30 void setBalance( double );
31 double getBalance() const;
32 Put limits on the size of the
33 private: first and last name.
34 int accountNumber; accountNumber (an int)
35 char lastName[ 15 ]; and balance (double) are
36 char firstName[ 10 ]; already of a fixed size.
37 double balance;
38
39 }; // end class ClientData
40 clientData.h
41 #endif (2 of 2)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // Fig. 14.11: ClientData.cpp


2 // Class ClientData stores customer's credit information.
3 #include <iostream>
4
5 using std::string;
6
7 #include <cstring>
8 #include "clientData.h"
9
10 // default ClientData constructor
11 ClientData::ClientData( int accountNumberValue,
12 string lastNameValue, string firstNameValue,
13 double balanceValue )
14 {
15 setAccountNumber( accountNumberValue );
16 setLastName( lastNameValue );
17 setFirstName( firstNameValue );
18 setBalance( balanceValue );
19
20 } // end ClientData constructor
21
22 // get account-number value
23 int ClientData::getAccountNumber() const
24 {
25 return accountNumber;
26
ClientData.cpp
27 } // end function getAccountNumber (1 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


28
29 // set account-number value
30 void ClientData::setAccountNumber( int accountNumberValue )
31 {
32 accountNumber = accountNumberValue;
33
34 } // end function setAccountNumber
35
36 // get last-name value
37 string ClientData::getLastName() const
38 {
39 return lastName;
40
41 } // end function getLastName
42
43 // set last-name value
44 void ClientData::setLastName( string lastNameString )
45 {
46 // copy at most 15 characters from string to lastName
47 const char *lastNameValue = lastNameString.data();
48 int length = strlen( lastNameValue );
49 length = ( length < 15 ? length : 14 );
50 strncpy( lastName, lastNameValue, length );
51 ClientData.cpp
52 // append null character to lastName
53 lastName[ length ] = '\0'; (2 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

54
55 } // end function setLastName
56
57 // get first-name value
58 string ClientData::getFirstName() const
59 {
60 return firstName;
61
62 } // end function getFirstName
63
64 // set first-name value
65 void ClientData::setFirstName( string firstNameString )
66 {
67 // copy at most 10 characters from string to firstName
68 const char *firstNameValue = firstNameString.data();
69 int length = strlen( firstNameValue );
70 length = ( length < 10 ? length : 9 );
71 strncpy( firstName, firstNameValue, length );
72
73 // append new-line character to firstName
74 firstName[ length ] = '\0';
75 ClientData.cpp
76 } // end function setFirstName
77
(3 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


78 // get balance value
79 double ClientData::getBalance() const
80 {
81 return balance;
82
83 } // end function getBalance
84
85 // set balance value
86 void ClientData::setBalance( double balanceValue )
87 {
88 balance = balanceValue;
89 ClientData.cpp
90 } // end function setBalance (4 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

1 // Fig. 14.12: fig14_12.cpp


2 // Creating a randomly accessed file.
3 #include <iostream>
4
5 using std::cerr;
6 using std::endl;
7 using std::ios;
8
9 #include <fstream>
10
11 using std::ofstream;
12
13 #include <cstdlib>
14 #include "clientData.h" // ClientData class definition Open a file for raw writing
15 using an ofstream object
16 int main()
17 {
and ios::binary.
18 ofstream outCredit( "credit.dat", ios::binary );
19
20 // exit program if ofstream could not open file
21 if ( !outCredit ) {
22 cerr << "File could not be opened." << endl;
23 exit( 1 ); fig14_12.cpp
24 (1 of 2)
25 } // end if

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


26
27 // create ClientData with no information
28 ClientData blankClient; Create a blank object. Use
29 write to output the raw data
30 // output 100 blank records to file to a file (passing a pointer to
31 for ( int i = 0; i < 100; i++ ) the object and its size).
32 outCredit.write(
33 reinterpret_cast< const char * >( &blankClient ),
34 sizeof( ClientData ) );
35
36 return 0;
fig14_12.cpp
37
38 } // end main (2 of 2)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.9 Writing Data Randomly to a Random-


Access File
• Use seekp to write to exact location in file
– Where does the first record begin?
• Byte 0
– The second record?
• Byte 0 + sizeof(object)
– Any record?
• (Recordnum - 1) * sizeof(object)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


1 // Fig. 14.13: fig14_13.cpp
2 // Writing to a random access file.
3 #include <iostream>
4
5 using std::cerr;
6 using std::endl;
7 using std::cout;
8 using std::cin;
9 using std::ios;
10
11 #include <iomanip>
12
13 using std::setw;
14
15 #include <fstream>
16
17 using std::ofstream;
18
19 #include <cstdlib> fig14_13.cpp
20 #include "clientData.h" // ClientData class definition
(1 of 4)
21

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

22 int main()
23 {
24 int accountNumber;
25 char lastName[ 15 ];
Open file for raw (binary)
26 char firstName[ 10 ]; writing.
27 double balance;
28
29 ofstream outCredit( "credit.dat", ios::binary );
30
31 // exit program if ofstream cannot open file
32 if ( !outCredit ) {
33 cerr << "File could not be opened." << endl;
34 exit( 1 );
35
36 } // end if
37
38 cout << "Enter account number "
39 << "(1 to 100, 0 to end input)\n? "; Get account number, put into
40
41 // require user to specify account number
object. It has not yet been
42 ClientData client; written to file.
43 cin >> accountNumber;
44 client.setAccountNumber( accountNumber );
fig14_13.cpp
45 (2 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


46 // user enters information, which is copied into file
47 while ( client.getAccountNumber() > 0 &&
48 client.getAccountNumber() <= 100 ) {
49
50 // user enters last name, first name and balance
51 cout << "Enter lastname, firstname, balance\n? ";
52 cin >> setw( 15 ) >> lastName;
53 cin >> setw( 10 ) >> firstName;
54 cin >> balance;
55
56 Position outCredit to the
// set record lastName, firstName and balance values
57 client.setLastName( lastName ); proper location in the file
58 client.setFirstName( firstName );
59 client.setBalance( balance );
(based on the account
60 number).
61 // seek position in file of user-specified record
62 outCredit.seekp( ( client.getAccountNumber() - 1 ) *
63 sizeof( ClientData ) );
64
Write ClientData object
65 // write user-specified information in file to file at specified position.
66 outCredit.write(
67 reinterpret_cast< const char * >( &client ),
68 sizeof( ClientData ) ); fig14_13.cpp
69 (3 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

70 // enable user to specify another account number


71 cout << "Enter account number\n? ";
72 cin >> accountNumber;
73 client.setAccountNumber( accountNumber );
74
75 } // end while
76
77 return 0;
78
fig14_13.cpp
79 } // end main
(4 of 4)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


Enter account number (1 to 100, 0 to end input)
? 37
Enter lastname, firstname, balance
? Barker Doug 0.00
Enter account number Notice that accounts can be
? 29 created in any order.
Enter lastname, firstname, balance
? Brown Nancy -24.54
Enter account number
? 96
Enter lastname, firstname, balance
? Stone Sam 34.98
Enter account number
? 88
Enter lastname, firstname, balance
? Smith Dave 258.34
Enter account number
? 33
Enter lastname, firstname, balance
? Dunn Stacey 314.33 fig14_13.cpp
Enter account number
? 0
output (1 of 1)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.10 Reading Data Sequentially from a


Random-Access File
• read - similar to write
– Reads raw bytes from file into memory
– inFile.read( reinterpret_cast<char *>( &number ),
sizeof( int ) );
• &number: location to store data
• sizeof(int): how many bytes to read
– Do not use inFile >> number with raw bytes
• >> expects char *
• Upcoming program
– Output data from a random-access file
– Go through each record sequentially
• If no data (accountNumber == 0) then skip

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


1 // Fig. 14.14: fig14_14.cpp
2 // Reading a random access file.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7 using std::ios;
8 using std::cerr;
9 using std::left;
10 using std::right;
11 using std::fixed;
12 using std::showpoint;
13
14 #include <iomanip>
15
16 using std::setprecision;
17 using std::setw;
18
19 #include <fstream>
20
21 using std::ifstream;
22 using std::ostream;
23
24 #include <cstdlib> // exit protoyype
fig14_14.cpp
25 #include "clientData.h" // ClientData class definition
26 (1 of 3)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

27 void outputLine( ostream&, const ClientData & );


28
29 int main()
30 {
31 ifstream inCredit( "credit.dat", ios::in );
32
33 // exit program if ifstream cannot open file
34 if ( !inCredit ) {
35 cerr << "File could not be opened." << endl;
36 exit( 1 );
37
38 } // end if
Read sizeof(ClientData) bytes and put
39
40 cout << left << setw( 10 into
) << object client.
"Account" << setw(This
16 )may be an empty
41 << record.
"Last Name" << setw( 11 ) << "First Name" << left
42 << setw( 10 ) << right << "Balance" << endl;
43
44 ClientData client; // create record
45
46 // read first record from file
47 inCredit.read( reinterpret_cast< char * >( &client ),
48 sizeof( ClientData ) ); fig14_14.cpp
49 (2 of 3)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


50 // read all records from file
51 while ( inCredit && !inCredit.eof() ) {
Loop exits if there is an error
52 reading (inCredit == 0)
53 // display record
or EOF is found
54 if ( client.getAccountNumber() != 0 )
55 outputLine( cout, client ); (inCredit.eof() == 1)
56
57 // read next from file
58
Output non-empty accounts.
inCredit.read( reinterpret_cast< char * >( &client ),
59 sizeof( ClientData ) ); Note that outputLine
60
61 } // end while
takes an ostream argument.
62 We could easily output to
63 return 0;
64
another file (opened with an
65 } // end main ofstream object, which
66 derives from ostream).
67 // display single record
68 void outputLine( ostream &output, const ClientData &record )
69 {
70 output << left << setw( 10 ) << record.getAccountNumber()
71 << setw( 16 ) << record.getLastName().data()
72 << setw( 11 ) << record.getFirstName().data()
73 << setw( 10 ) << setprecision( 2 ) << right << fixed
74 << showpoint << record.getBalance() << endl; fig14_14.cpp
75
76 } // end outputLine
(3 of 3)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

Account Last Name First Name Balance


29 Brown Nancy -24.54
33 Dunn Stacey 314.33
37 Barker Doug 0.00
fig14_14.cpp
88 Smith Dave 258.34
96 Stone Sam 34.98
output (1 of 1)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.11 Example: A Transaction-Processing
Program
• Instant access for bank accounts
– Use random access file (data in client.dat)
• Give user menu
– Option 1: store accounts to print.txt
Account Last Name First Name Balance
29 Brown Nancy -24.54
33 Dunn Stacey 314.33
37 Barker Doug 0.00
88 Smith Dave 258.34
96 Stone Sam 34.98

– Option 2: update record


Enter account to update (1 - 100): 37
37 Barker Doug 0.00

Enter charge (+) or payment (-): +87.99


37 Barker Doug 87.99

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

14.11 Example: A Transaction-Processing


Program
• Menu options (continued)
– Option 3: add new record
Enter new account number (1 - 100): 22
Enter lastname, firstname, balance
? Johnston Sarah 247.45

– Option 4: delete record


Enter account to delete (1 - 100): 29
Account #29 deleted.

• To open file for reading and writing


– Use fstream object
– "Or" file-open modes together
fstream inOutCredit( "credit.dat", ios::in | ios::out );

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


1 // Fig. 14.15: fig14_15.cpp
2 // This program reads a random access file sequentially, updates
3 // data previously written to the file, creates data to be placed
4 // in the file, and deletes data previously in the file.
5 #include <iostream>
6
7 using std::cout;
8 using std::cerr;
9 using std::cin;
10 using std::endl;
11 using std::ios;
12 using std::left;
13 using std::right;
14 using std::fixed;
15 using std::showpoint;
16
17 #include <fstream>
18
19 using std::ofstream;
20 using std::ostream;
21 using std::fstream;
22
23 #include <iomanip>
24
25 using std::setw;
26 using std::setprecision;
27 fig14_15.cpp
28 #include <cstdlib> // exit prototype
29 #include "clientData.h" // ClientData class definition (1 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

30
31 int enterChoice();
32 void printRecord( fstream& );
33 void updateRecord( fstream& );
34 void newRecord( fstream& );
35 void deleteRecord( fstream& );
36 void outputLine( ostream&, const ClientData & );
37 int getAccount( const char * const );
38
39 enum Choices { PRINT = 1, UPDATE, NEW, DELETE, END };
40 Open file for reading and writing
41 int main() (fstream object needed).
42 {
43 // open file for reading and writing
44 fstream inOutCredit( "credit.dat", ios::in | ios::out );
45
46 // exit program if fstream cannot open file
47 if ( !inOutCredit ) {
48 cerr << "File could not be opened." << endl;
49 exit ( 1 );
50
fig14_15.cpp
51 } // end if (2 of 14)
52

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


53 int choice;
54
55 // enable user to specify action
56 while ( ( choice = enterChoice() ) != END ) {
57
58 switch ( choice ) {
59
60 // create text file from record file
61 case PRINT:
62 printRecord( inOutCredit );
63 break;
64
65 // update record
66 case UPDATE:
67 updateRecord( inOutCredit );
68 break;
69
70 // create record
71 case NEW:
72 newRecord( inOutCredit );
73 break;
74
75 // delete existing record
76 case DELETE:
77 deleteRecord( inOutCredit );
78 break;
fig14_15.cpp
79 (3 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

53 int choice;
54
55 // enable user to specify action
56 while ( ( choice = enterChoice() ) != END ) {
57
58 switch ( choice ) { Displays menu and returns
59
60 // create text file from record file user's choice.
61 case PRINT:
62 printRecord( inOutCredit );
63 break;
64
65 // update record
66 case UPDATE:
67 updateRecord( inOutCredit );
68 break;
69
70 // create record
71 case NEW:
72 newRecord( inOutCredit );
73 break;
74
75 // delete existing record
76 case DELETE:
77 deleteRecord( inOutCredit ); fig14_15.cpp
78 break;
79
(4 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


80 // display error if user does not select valid choice
81 default:
82 cerr << "Incorrect choice" << endl;
83 break;
84
85 } // end switch
86
87 inOutCredit.clear(); // reset end-of-file indicator
88
89 } // end while
90
91 return 0;
92
93 } // end main
94
95 // enable user to input menu choice
96 int enterChoice()
97 {
98 // display available options
99 cout << "\nEnter your choice" << endl
100 << "1 - store a formatted text file of accounts" << endl
101 << " called \"print.txt\" for printing" << endl
102 << "2 - update an account" << endl
103 << "3 - add a new account" << endl fig14_15.cpp
104 << "4 - delete an account" << endl
105 << "5 - end program\n? "; (5 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

106
107 int menuChoice;
108 cin >> menuChoice; // receive choice from user
109
Output to print.txt. First,
110 return menuChoice; print the header for the table.
111
112 } // end function enterChoice
113
114 // create formatted text file for printing
115 void printRecord( fstream &readFromFile )
116 {
117 // create text file
118 ofstream outPrintFile( "print.txt", ios::out );
119
120 // exit program if ofstream cannot create file
121 if ( !outPrintFile ) {
122 cerr << "File could not be created." << endl;
123 exit( 1 );
124
125 } // end if
126
127 outPrintFile << left << setw( 10 ) << "Account" << setw( 16 )
128 << "Last Name" << setw( 11 ) << "First Name" << right fig14_15.cpp
129 << setw( 10 ) << "Balance" << endl;
(6 of 14)
130

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


131 // set file-position pointer to beginning of record file
132 readFromFile.seekg( 0 );
133
134 // read first record from record file Go to front of file, read
135 ClientData client;
136 readFromFile.read( reinterpret_cast< char * >( &client ),
account data, and print record
137 sizeof( ClientData ) ); if not empty.
138
139 // copy all records from record file into text file
Note that outputLine
140 while ( !readFromFile.eof() ) {
141 takes an ostream object
142 // write single record to text file (base of ofstream). It can
143 if ( client.getAccountNumber() != 0 )
144 outputLine( outPrintFile, client );
easily print to a file (as in this
145 case) or cout.
146 // read next record from record file
147 readFromFile.read( reinterpret_cast< char * >( &client ),
148 sizeof( ClientData ) );
149
150 } // end while
151 fig14_15.cpp
152 } // end function printRecord
153
(7 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

154 // update balance in record


155 void updateRecord( fstream &updateFile )
156 {
157 // obtain number of account to update
158 int accountNumber = getAccount( "Enter account to update" );
159
160 // move file-position pointer to correct record in file
161 updateFile.seekg(
162 ( accountNumber - 1 ) * sizeof( ClientData ) );
163
164 // read first record from file This is fstream (I/O) because
165 ClientData client;
166 updateFile.read( reinterpret_cast< char * >( &client ), we must read the old balance,
167 sizeof( ClientData ) );
168
update it, and write the new
169 // update record balance.
170 if ( client.getAccountNumber() != 0 ) {
171 outputLine( cout, client );
172
173 // request user to specify transaction
174 cout << "\nEnter charge (+) or payment (-): ";
175 double transaction; // charge or payment
176 cin >> transaction;
177
178 // update record balance
179 double oldBalance = client.getBalance();
180 client.setBalance( oldBalance + transaction ); fig14_15.cpp
181 outputLine( cout, client );
182 (8 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


183 // move file-position pointer to correct record in file
184 updateFile.seekp(
185 ( accountNumber - 1 ) * sizeof( ClientData ) );
186
187 // write updated record over old record in file
188 updateFile.write(
189 reinterpret_cast< const char * >( &client ),
190 sizeof( ClientData ) );
191
192 } // end if
193
194 // display error if account does not exist
This is fstream because we
195 else read to see if a non-empty
196 cerr << "Account #" << accountNumber
197 << " has no information." << endl;
record already exists. If not,
198 we write a new record.
199 } // end function updateRecord
200
201 // create and insert record
202 void newRecord( fstream &insertInFile )
203 {
204 // obtain number of account to create
205 int accountNumber = getAccount( "Enter new account number" );
206
207 // move file-position pointer to correct record in file
208 insertInFile.seekg(
fig14_15.cpp
209 ( accountNumber - 1 ) * sizeof( ClientData ) ); (9 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

210
211 // read record from file
212 ClientData client;
213 insertInFile.read( reinterpret_cast< char * >( &client ),
214 sizeof( ClientData ) );
215
216 // create record, if record does not previously exist
217 if ( client.getAccountNumber() == 0 ) {
218
219 char lastName[ 15 ];
220 char firstName[ 10 ];
221 double balance;
222
223 // user enters last name, first name and balance
224 cout << "Enter lastname, firstname, balance\n? ";
225 cin >> setw( 15 ) >> lastName;
226 cin >> setw( 10 ) >> firstName;
227 cin >> balance;
228
229 // use values to populate account values
230 client.setLastName( lastName );
231 client.setFirstName( firstName );
232 client.setBalance( balance );
233 client.setAccountNumber( accountNumber );
fig14_15.cpp
234 (10 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


235 // move file-position pointer to correct record in file
236 insertInFile.seekp( ( accountNumber - 1 ) *
237 sizeof( ClientData ) );
238
239 // insert record in file
240 insertInFile.write(
241 reinterpret_cast< const char * >( &client ),
242 sizeof( ClientData ) );
243
244 } // end if
245
246 // display error if account previously exists
247 else
248 cerr << "Account #" << accountNumber
249 << " already contains information." << endl;
250
251 } // end function newRecord fig14_15.cpp
252 (11 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

253 // delete an existing record


254 void deleteRecord( fstream &deleteFromFile )
255 {
256 // obtain number of account to delete
257 int accountNumber = getAccount( "Enter account to delete" );
258
259 // move file-position pointer to correct record in file
260 deleteFromFile.seekg(
261 ( accountNumber - 1 ) * sizeof( ClientData ) );
262
263 // read record from file
264 ClientData client; fstream because we read to
265 deleteFromFile.read( reinterpret_cast< char * >( &client ),
check if the account exits. If it
266 sizeof( ClientData ) );
267 does, we write blank data
268 // delete record, if record exists in file (erase it). If it does not exist,
269 if ( client.getAccountNumber() != 0 ) {
270 ClientData blankClient; there is no need to delete it.
271
272 // move file-position pointer to correct record in file
273 deleteFromFile.seekp( ( accountNumber - 1 ) *
274 sizeof( ClientData ) ); fig14_15.cpp
275
(12 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


276 // replace existing record with blank record
277 deleteFromFile.write(
278 reinterpret_cast< const char * >( &blankClient ),
279 sizeof( ClientData ) );
280
281 cout << "Account #" << accountNumber << " deleted.\n";
282
283 } // end if
284
285 // display error if record does not exist
286 else
287 cerr << "Account #" << accountNumber << " is empty.\n"; outputLine is very flexible, and can
288
289 } // end deleteRecord
output to any ostream object (such as
290 a file or cout).
291 // display single record
292 void outputLine( ostream &output, const ClientData &record )
293 {
294 output << left << setw( 10 ) << record.getAccountNumber()
295 << setw( 16 ) << record.getLastName().data()
296 << setw( 11 ) << record.getFirstName().data()
297 << setw( 10 ) << setprecision( 2 ) << right << fixed
298 << showpoint << record.getBalance() << endl;
299 fig14_15.cpp
300 } // end function outputLine
301
(13 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

302 // obtain account-number value from user


303 int getAccount( const char * const prompt )
304 {
305 int accountNumber;
306
307 // obtain account-number value
308 do {
309 cout << prompt << " (1 - 100): ";
310 cin >> accountNumber;
311
312 } while ( accountNumber < 1 || accountNumber > 100 );
313
314 return accountNumber;
315 fig14_15.cpp
316 } // end function getAccount (14 of 14)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ


14.12 Input/Output of Objects

• I/O of objects
– Chapter 8 (overloaded >>)
– Only object's data transmitted
• Member functions available internally
– When objects stored in file, lose type info (class, etc.)
• Program must know type of object when reading
– One solution
• When writing, output object type code before real object
• When reading, read type code
– Call proper overloaded function (switch)

ΑΝΣΙΚΕΙΜΕΝΟ΢ΣΡΑΦΗ΢ ΠΡΟΓΡΑΜΜΑΣΙ΢ΜΟ΢ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ΢ ΣΕ

You might also like