Professional Documents
Culture Documents
Ενότητα 1
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
•Ποόςσπα C++:
ANSI/ISO: 1998
ISO: 2011
Java
C++ vs Java
•ςξ ποόγοαμμα ρπξσδώμ ποξβλέπεςαι και η εκμάθηρη ςηπ Java (ρςξ μάθημα
Μεθξδξλξγία Ποξγοαμμαςιρμξύ ςξσ 6ξσ εναμήμξσ).
•Η κάθε γλώρρα ποξξοίζεςαι για άλλεπ εταομξγέπ και διατξοεςικέπ απαιςήρειπ. Παοόλξ
πξσ η Java μξιάζει με ςη C++, ποόκειςαι για διατξοεςικέπ γλώρρεπ. Π.υ:
Η C++ επιςοέπει ρσμαοςήρειπ πξσ δεμ είμαι μέθξδξι ςάνεχμ.
• Δπιρςημξμικξί σπξλξγιρμξί
C++ vs Java
Ποξςιμάςαι η C++ όςαμ η ςαυύςηςα ςξσ ποξγοάμμαςξπ είμαι
κοίριμξπ παοάγξμςαπ:
Παοάγεςαι κώδικαπ μηυαμήπ από ςημ αουή, όυι byte code και Just
in-time (JIT) παοαγχγή κώδικα
Ολική βελςιρςξπξίηρη ςξσ κώδικα από ςξμ compiler, κάςι πξσ δεμ
μπξοεί μα γίμει ρςη Java.
Δε μερξλαβεί κάπξια Virtual Machine (π.υ. JVM) πξσ ρπαςαλά
πόοξσπ για ςη δική ςηπ λειςξσογία.
Μπξοξύμ μα υοηριμξπξιηθξύμ βελςιρςξπξιημέμεπ σλξπξιήρειπ και
ειδικά CPU Instruction Sets (π.υ. SSE4).
Ο ποξγοαμμαςιρςήπ μπξοεί μα παοέμβει ρε πξλύ υαμηλό επίπεδξ
ρςη βελςιρςξπξίηρη ςηπ απόδξρηπ.
Μπξοξύμ μα σλξπξιηθξύμ δικξί μαπ μηυαμιρμξί διαυείοιρηπ μμήμηπ (caches, memory pooling,
lazy allocators).
Δπίρηπ ποξςιμάςαι η C++ όςαμ απαιςείςαι υαμηλή καςαμάλχρη εμέογειαπ:
Δε μερξλαβεί Virtual Machine. Η VM είμαι και η ίδια έμα εκςελέριμξ ποόγοαμμα, ξπόςε όςαμ
εκςελείςαι ξ κώδικά, υοηριμξπξιξύμςαι παοάλληλα επιποόρθεςξι πόοξι ςξσ ρσρςήμαςξπ
(κσοίχπ κύκλξσπ CPU) πξσ καςαμαλώμξσμ εμέογεια.
Δνκεκέλνο Πξνγξακκαηηζκόο
Κύξηα
αληηθείκελν θώδηθα κε ηηο
βηβιηνζήθεο, δεκηνπξγεί ην
Mλήκε εθηειέζηκν αξρείν θαη ην
3. Μεηαγιώηηηζε Φνξησηήο απνζεθεύεη ζην δίζθν.
Ο θνξηωηήο θνξηώλεη ην
4. Σύλδεζε Γίζθνο ..
..
πξόγξακκα ζηε κλήκε.
..
5. Φόξηωζε Κύξηα
Mλήκε
CPU
Η CPU παίξλεη θάζε νδεγία
6. Εθηέιεζε θαη ηελ εθηειεί,
απνζεθεύνληαο πηζαλώο λέεο
.. ηηκέο δεδνκέλωλ θαηά ηελ
..
.. εθηέιεζε ηνπ πξνγξάκκαηνο.
Οοξλξγία
Κλάρη (Class)
Μία κλάρη είμαι μία ρσλλξγή από αμςικείμεμα, πξσ
μξιοάζξμςαι ςα ίδια υαοακςηοιρςικά και επιδοξύμ με ςξ
ρύρςημα με ςξμ ίδιξ ςοόπξ. Σα υαοακςηοιρςικά και η
επίδοαρη ξοίζξμςαι για ςιπ κλάρειπ.
Αμςικείμεμξ (Object)
Έμα αμςικείμεμξ είμαι έμα μέλξπ μίαπ κλάρηπ. Αμ και ξ
ξοιρμόπ γίμεςαι ρε επίπεδξ κλάρηπ, η ποαγμαςική
επίδοαρη ρσμβαίμει με αμενάοςηςα αμςικείμεμα.
Οοξλξγία (ρσμέυεια)
σμαοςήρειπ (Functions)
ςξμ ποξγοαμαςιρμό ξ κώδικαπ για μία ρσγκεκοιμέμη εμέογεια
ξμξμάζεςαι ρσμάοςηρη.
ςξμ αμςικειμεμξρςοατή ποξγοαμμαςιρμό ςημ αλληλεπίδοαρη
μεςανύ αμςικειμέμχμ ή αμςικειμέμχμ και ςξσ ένχ κόρμξσ, ςημ
υειοίζξμςαι ξι ρσμαοςήρειπ. Ασςό ξμξμάζεςαι ρσμπεοιτξοά.
Μία αμςικειμεμξρςοατήπ ρσμάοςηρη είμαι παοόμξια με μία
ρσμηθιρμέμη ρσμάοςηρη αλλά γεμικά ξι αμςικειμεμξρςοατείπ
ρσμαοςήρειπ ςείμξσμ μα είμαι μικοόςεοεπ και απλξύρςεοεπ.
Δμθσλάκχρη (Encapsulation)
• Ασςή ξοίζει ςξ βαθμό ποξρπελαριμόςηςαπ πξσ μία κλάρη
επιςοέπει ρε άλλεπ κλάρειπ. Δίμει ςη δσμαςόςηςα ρςιπ γλώρρεπ
αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ μα ξμαδξπξιξύμ και μα
απξκούπςξσμ δεδξμέμα και διαδικαρίεπ ςχμ αμςικειμέμχμ.
• Κάπξιεπ πληοξτξοίεπ είμαι ποξρπελάριμεπ μόμξ μέρα ρε μία
κλάρη.
• Κάπξιεπ πληοξτξοίεπ είμαι ποξρπελάριμεπ ένχ από ςημ κλάρη
αλλά μόμξ ρε ρσγγεμείπ κλάρειπ.
• Κάπξιεπ πληοξτξοίεπ είμαι ποξρπελάριμεπ γεμικά.
• Ο καλόπ αμςικειμεμξρςοατήπ ποξγοαμμαςιρμόπ κοαςά ςιπ
πληοξτξοίεπ όρξ πιξ ιδιχςικέπ γίμεςαι.
Πξλσμξοτιρμόπ (Polymorphism)
• Ασςόπ αματέοεςαι ρςημ αλληλεπίδοαρη μεςανύ αμςικειμέμχμ. Σα
αμςικείμεμα ρυεςίζξμςαι μέρα ρςξ ρύρςημα και με ςξμ ένχ κόρμξ με ςιπ
εμέογειεπ.
Δπαμαυοηριμξπξίηρη (reusability)
• Μία κλάρη , ατξύ δημιξσογηθεί, μπξοεί μα διαμεμηθεί για μα
υοηριμξπξιηθεί ρε πξλλά ποξγοάμμαςα. Ασςό καλείςαι
επαμαυοηριμξπξίηρη και είμαι ραμ ςιπ βιβλιξθήκεπ
ρσμαοςήρεχμ πξσ υοηριμξπξιξύμ ξι διαδικαρςικέπ γλώρρεπ.
• ςξμ αμςικειμεμξρςοατή ποξγοαμμαςιρμό, με ςημ έμμξια ςηπ
κληοξμξμικόςηςαπ δίμεςαι η δσμαςόςηςα μα επεκςαθεί η
έμμξια ςηπ επαμαυοηριμξπξίηρηπ. Μπξοξύμε μα πάοξσμε μία
σπάουξσρα κλάρη και υχοίπ μα ςημ ςοξπξπξιήρξσμε, μα
ποξρθέρξσμε ρ‟ ασςήμ επιπλέξμ υαοακςηοιρςικά και
δσμαςόςηςεπ.
Η Γλώρρα C++
Δξμή ποξγοάμμαςξπ: Σε παιαηόηεξνπο κεηαγιωηηηζηέο
γξάθνπκε <iostream.h>, ρωξίο ηε
#include <iostream> ρξήζε namespace.
using namespace std;
main()
{
cout << “Hello world“;
}
υόλια
/* ρυόλια
πξλλώμ
γοαμμώμ */
Χειοιρςέπ
Δίμαι ςελερςέπ πξσ υοηριμξπξιξύμςαι με ςξμ ςελερςή << για μα ςοξπξπξιξύμ ή μα υειοίζξμςαι ςα δεδξμέμα χπ
ποξπ ςξμ ςοόπξ πξσ θα εμταμιρςξύμ.
Τύπξι δεδξμέμωμ
Τύπος Από ΄Εως Ψηφία Bytes μνήμης
ακρίβειας
char -128 127 1
#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μτχλεσμέμη επιλξγή
• Πξλλαπλή επιλξγή
Δξμή Επαμάληφηπ
• Επαμαληπςικό ρυήμα με αουικό έλεγυξ επαμάληφηπ
• Επαμαληπςικό ρυήμα με ςελικό έλεγυξ επαμάληφηπ
• Επαμαληπςικό ρυήμα ρσγκεκοιμέμξσ αοιθμξύ επαμαλήφεχμ
Δξμέπ επιλξγήπ
Πξλλαπλή επιλξγή
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”;
Δξμέπ επαμάληφηπ
Επαμαληπςικό ρυήμα με αουικό έλεγυξ επαμάληφηπ:
sum = 0;
cin >> x;
while (x != 0)
{
sum = sum + x;
cin >> x;
}
cout << sum;
Δξμέπ επαμάληφηπ
Oοιρμόπ ρσμάοςηρηπ
<ςύπξπ δεδξμέμχμ επιρςοξτήπ> <όμξμα ρσμάοςηρηπ> <λίρςα παοαμέςοχμ>
{
<δήλχρη ςξπικώμ μεςαβληςώμ>
<κώδικαπ ρσμάοςηρηπ>
}
// κλήρη ρσμάοςηρηπ
c = athroisma(a,b);
// κλήρη ρσμάοςηρηπ
athroisma(a,b);
}
Απνηέιεζκα ζηελ νζόλε 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
#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, ρσμέυεια ρςημ επόμεμη διατάμεια
Αποηέλεζμα:
10/1=10
(10+20)/2=15
(30+30)/3=20
Μία ρσμάοςηρη ξμξμάζεςαι αμαδοξμική όςαμ μία εμςξλή ςξσ ρώμαςξπ ςηπ ρσμάοςηρηπ καλεί ςξμ ίδιξ ςηπ ςξμ
εασςό. Η αμαδοξμή είμαι μία διαδικαρία με ςημ ξπξία ξοίζξσμε κάςι μέρχ ςξσ ίδιξσ ςξσ ξοιζόμεμξσ.
Επενηγήρειπ:
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)
κ.ξ.κ.
Από ςα παοαπάμχ ποξκύπςει όςι κάθε ρυέρη είμαι ίδια με ςημ ποξηγξύμεμη, με απλή
αλλαγή ςχμ ξοιρμάςχμ.
#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 Καλνληθή κεηαβιεηή.
base_type * pointer_name ;
Δήλχρη δείκςη
Γιαςί ποέπει μα δηλχθεί ξ ςύπξπ ςηπ καμξμικήπ μεςαβληςήπ;
Γιαςί όςαμ δηλώμεςαι μία (καμξμική) μεςαβληςή, δερμεύεςαι ρσγκεκοιμέμη μμήμη, π.υ. 8
bytes για double, 4 bytes για int.
Ο δείκςηπ αματέοεςαι ρε μία διεύθσμρη, ρςημ ξπξία απξθηκεύεςαι η ςιμή μίαπ καμξμικήπ
μεςαβληςήπ.
Ο δείκςηπ υοηριμξπξιείςαι για μα γίμεςαι έμμερη αματξοά ρ‟ ασςήμ ςημ ςιμή. Έςρι,
ποέπει μα γμχοίζξσμε πόρη ακοιβώπ μμήμη καςαλαμβάμει ασςή η ςιμή.
Δήλχρη δείκςη
Πώπ επιλέγεςαι ςξ όμξμα εμόπ δείκςη;
Παοάδειγμα:
int *pcount, *count_ptr; // δείκςεπ ρε ακεοαίξσπ
char *pword, *word_ptr; // δείκςεπ ρε υαοακςήοεπ
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
Αουικξπξίηρη δεικςώμ
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
Αουικξπξίηρη δεικςώμ
4) Φοηριμξπξιώμςαπ ςξμ ςελερςή διεύθσμρηπ &
(address-of operator)
int *pnum;
int count;
pnum = &count;
...
...
...
Ο αρςεοίρκξπ σπξδηλώμει όςι ποέπει μα ακξλξσθηθεί ςξ
βέλξπ για μα ποξρπελαρθξύμ ςα δεδξμέμα ςηπ θέρηπ, ρςημ
ξπξία δείυμει.
*pcount = 20;
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, 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; 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;
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;
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
}
Δπενηγήρειπ:
Αμ και η ρσμάοςηρη swap() δεμ επιρςοέτει ςίπξςε άμερα ρςη main(), έυει μία παοεμέογεια (side effect).
Όςαμ καλείςαι η swap(), ςα ξοίρμαςά ςηπ είμαι ξι δείκςεπ px και py, ξι ξπξίεπ ρυεςίζξμςαι με ςιπ διεσθύμρειπ ςχμ x
και y, αμςίρςξιυα.
Παοαςήοηρη: δε υοειάζεςαι μα δηλώρξσμε ςξσπ δείκςεπ px και py. Σξ μόμξ πξσ απαιςείςαι είμαι μα πεοαρθξύμ ξι
διεσθύμρειπ ςχμ x και y ρςη swap(), όπχπ ταίμεςαι ακξλξύθχπ:
void main () {
Aληηγξάθεη ηελ ηηκή ηνπ
int *pscore, num;
pscore (δειαδή ηε δηεύζπλζε
num = 32;
ζηελ νπνία δείρλεη) ζηνλ ptr
pscore = #
print(pscore); void print(int *ptr) {
} printf(“%d”, *ptr);
ptr=ptr+1;
}
#include <iostream>
#include <cstdlib> Για να εμθανιζθεί η διεύθσνζη ζε ακέραια μορθή
using namespace std;
int *incr(int *pkitsos);
main() {
int *pscore, *pm, num;
num=32;
pscore=#
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;
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);
}
Πξαγκαηηθή
παξάκεηξνο Παξάκεηξνο ζπλάξηεζεο
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*/
} }
Παοάδειγμα 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;
}
Παοάδειγμα 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!
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
Περιεχόμενα ενότητασ
1. Κλάσεις και αμτικείμεμα
2. Οπιζμόρ ανηικειμένων
3. Ιδιωηικά και δημόζια μέλη
4. Κλήζη ζςναπηήζεων-μελών
5. Απόδοζη ηιμών μέζω παπαμέηπων
6. Σςναπηήζειρ εγκαηάζηαζηρ/δόμηζηρ (constructors)
7. Σςναπηήζειρ αποζύνδεζηρ/αποδόμηζηρ (destructors)
8. Σςναπηήζειρ δόμηζηρ με ςπεπθόπηωζη (constructor
overloading)
9. Σςναπηήζειρ-μέλη οπιζόμενερ έξω από ηην κλάζη
10. Σςναπηήζειρ δόμηζηρ – εναλλακηικόρ οπιζμόρ
11. Ανηικείμενα ωρ οπίζμαηα ζςναπηήζεων
12. Επιζηποθή ανηικειμένων από ζςναπηήζειρ
13. Ένηαξη κλάζηρ ζηοςρ ηύποςρ δεδομένων
Η ποόςαρη
Person p1, p2;
ξοίζει δύξ αμςικείμεμα (objects) ςηπ κλάρηπ Person.
Σσμαοςήρειπ εγκαςάρςαρηπ/δόμηρηπ
(constructors)
•Μεοικέπ τξοέπ είμαι βξλικό για έμα αμςικείμεμξ μα λαμβάμει άμερα
αουικέπ ςιμέπ, ςημ ποώςη τξοά πξσ δημιξσογείςαι, υχοίπ μα απαιςείςαι
μα καλέρξσμε μία νευχοιρςή ρσμάοςηρη-μέλξπ.
Σσμαοςήρειπ εγκαςάρςαρηπ/δόμηρηπ
(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;
}
Σσμαοςήρειπ απξρύμδερηπ/απξδόμηρηπ
(destructors)
class Account
{
private:
float balance;
public:
Account()
{
balance = 0;
}
~Account() // συμάρτηση αποσύμδεσης
{
cout << “The account has been deleted” << endl;
}
.
.
};
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);
};
W. Savitch, Absolute
C++, 5th Ed.
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.
Ενότητα 3
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
class Account
{
private:
float balance;
public:
Account()
{
balance = 0;
}
Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
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;
}
Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
Aποηέλεζμα:
rec2 > rec1
Υπεοτόοςχρη ςελερςώμ
με υοήρη ρσμαοςήρεχμ-μελώμ
Οι τίλιεπ (friend) ρσμαοςήρειπ δηλώμξμςαι ρςξ public ςμήμα μίαπ κλάρηπ με ςξ ποόθεμα
friend, αλλά ξοίζξμςαι όπχπ ξι καμξμικέπ ρσμαοςήρειπ εκςόπ ςηπ κλάρηπ, υχοίπ ςξ
class_name ::, και ποξρπελαύμξσμ ςα ιδιχςικά μέλη ςχμ αμςικειμέμχμ ςηπ κλάρηπ.
Καςά ρσμέπεια δεμ απξςελξύμ ρσμαοςήρειπ-μέλη και ξ δείκςηπ this δε μεςαβιβάζεςαι.
Παοάδειγμα τίλιαπ ρσμάοςηρηπ:
class rectangle
{
private:
float side_a, side_b;
public:
rectangle(float a, float b);
rectangle();
Πίμακεπ
Οι πίμακεπ (ρσλλξγέπ ρςξιυείχμ ςξσ ίδιξσ ςύπξσ δεδξμέμχμ) καςαςάρρξμςαι
ρςιπ ρςαςικέπ δξμέπ δεδξμέμχμ.
Με ςξμ όοξ ρςαςική δξμή δεδξμέμωμ εμμξείςαι όςι ςξ ακοιβέπ μέγεθξπ ςηπ
απαιςξύμεμηπ κύοιαπ μμήμηπ καθξοίζεςαι καςά ςη ρςιγμή ςξσ
ποξγοαμμαςιρμξύ ςξσπ, επξμέμχπ καςά ςη ρςιγμή ςηπ μεςάτοαρηπ ςξσ
ποξγοάμμαςξπ και όυι καςά ςη ρςιγμή ςηπ εκςέλερήπ ςξσ.
Πίμακεπ
Οοιρμόπ μξμξδιάρςαςξσ Οοιρμόπ διρδιάρςαςξσ
πίμακα ακεοαίωμ: πίμακα ακεοαίωμ:
#define N 10 #define M 8
#define N 10
main()
{ main()
int p[N]; {
. int p[M][N];
. .
. .
. .
} .
}
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ ΣΕ
Πίμακεπ ρε ρσμαοςήρειπ
Πίμακεπ ρε ρσμαοςήρειπ
Deitel & Deitel, C++
How to Program
Πίμακεπ ρε ρσμαοςήρειπ
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 }
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 6;
theory_3_matrices_1.cpp
Πίμακεπ αμςικειμέμχμ
Όπχπ έμα αμςικείμεμξ μπξοεί μα πεοιέυει έμαμ πίμακα, μπξοεί μα ιρυύει
και ςξ αμςίρςοξτξ, δηλαδή μα έυξσμε έμαμ πίμακα πξσ μα πεοιέυει
αμςικείμεμα.
#include <cstdlib>
#include <iostream>
const int N = 4;
class Employee
{
private:
int rn;
char name[20];
float salary; theory_3_matrices_2.cpp
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;
Ενότητα 4
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
Μεςαςοξπή ςύπχμ
Γμχοίζξσμε από ποιμ όςι ποξςάρειπ όπχπ
x = y;
όπξσ x και y είμαι π.υ. ακέοαιξσ ςύπξσ, απξδίδξσμ ςημ ςιμή μίαπ μεςαβληςήπ
ρε μία άλλη.
Παοόμξια, η ποόςαρη
a1 = a2 + a3
όπξσ ςα a1, a2, a3 είμαι αμςικείμεμα, απξδίδει ςημ ςιμή εμόπ αμςικειμέμξσ ρε
έμα άλλξ.
Έςρι, ξι απξδόρειπ ςιμώμ μεςανύ μεςαβληςώμ βαρικώμ ςύπχμ και ςύπχμ
ξοιρμέμχμ από ςξμ υοήρςη, αμαλαμβάμξμςαι από ςξ μεςαγλχςςιρςή, αοκεί μα
είμαι ξ ίδιξπ ςύπξπ δεδξμέμχμ και από ςιπ δύξ πλεσοέπ ςξσ ςελερςή αμάθερηπ.
Όςαμ ξι μεςαβληςέπ είμαι διατξοεςικξύ ςύπξσ, ςόςε, εάμ είμαι και ξι δύξ
βαρικξύ ςύπξσ, η μεςαςοξπή γίμεςαι ασςόμαςα από ςξ μεςαγλχςςιρςή
(casting). Σε διατξοεςική πεοίπςχρη ποέπει εμείπ μα ξοίρξσμε ςη λειςξσογία,
όπχπ θα αμαλσθεί ρςιπ επόμεμεπ διατάμειεπ.
theory_4_casting_1.cpp
main()
{
const int ft=6;
const int in=10;
EngDist d1, d2(ft,in), d3(1.8295);
float metr;
EngDist :: EngDist()
{
feet = 0;
inches = 0;
}
EngDist :: EngDist(int feet1, int inches1)
{
feet = feet1;
inches = inches1;
}
int getFeet()
{
return feet;
}
float getInches()
{
return inches;
}
}; // τέλος της κλάσης EngDist
gr = eng;
cout << “Distance (anglo-saxon imperial metric system)= “;
eng.printDist();
cout << “Distance (international metric system)= “;
gr.printDist();
}
class EngDist
{
private:
int feet;
int inches;
public:
EngDist()
{
feet = 0; inches = 0;
}
Ενότητα 5
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
Κληοξμξμικόςηςα
Η κληοξμξμικόςηςα είμαι έμα από ςα πιξ ιρυσοά υαοακςηοιρςικά ςξσ
αμςικειμεμξρςοατξύπ ποξγοαμμαςιρμξύ.
Δίμαι ξ μηυαμιρμόπ πξσ επιςοέπει ρε μία κλάρη μα κληοξμξμεί όλη ςη
ρσμπεοιτξοά και ςιπ ιδιόςηςεπ μίαπ άλληπ κλάρηπ.
Η κλάρη πξσ κληοξμξμεί ξμξμάζεςαι παοάγχγη ή απξοοέξσρα κλάρη
(derived class), εμώ η κλάρη πξσ παοέυει ςημ κληοξμξμικόςηςα ξμξμάζεςαι
βαρική κλάρη (base class).
Έμα από ςα πλεξμεκςήμαςα ςηπ κληοξμξμικόςηςαπ είμαι όςι επιςοέπει ςημ
επαμαυοηριμξπξίηρη ςξσ κώδικα. Ατξύ γοατεί μία βαρική κλάρη και γίμει
εκρταλμάςχρη, δε υοειάζεςαι μα ςημ ναμαπειοάνξσμε. Μπξοξύμε μα ςημ
ποξραομόρξσμε μα λειςξσογεί ρε διάτξοεπ ρσμθήκεπ.
Η επαμαυοηριμξπξίηρη σπάουξμςξπ κώδικα ενξικξμξμεί υοόμξ, υοήμα και
ασνάμει ςημ ανιξπιρςία ςξσ ποξγοάμμαςξπ.
Κληοξμξμικόςηςα
Ιεοαουία κλάρεχμ
–Άμερη βαρική κλάρη: Κληοξμξμείςαι απ’ εσθείαπ (ιεοαουία εμόπ επιπέδξσ).
Απλή
Υπάλληλος Σποσδαζηής Απόθοιηος κληρονομικότητα
Απλή
Ακαδημαχκός Διοικηηικός κληρονομικότητα
Απλή
Διοικών Διδάζκφν κληρονομικότητα
Πολλαπλή
Διοικών-Διδάζκφν κληρονομικότητα
Ιεοαουία κληοξμξμικόςηςαπ
Ιεοαοχία κληοξμξμικόςηςαπ για ρχήμαςα:
Στήμα
2-ΔιαζηάζεφνΣτήμα 3-ΔιαζηάζεωνΣσήμα
Σποσδαζηής Μεηαπηστιακός
Προπηστιακός
Στήμα Κύκλος
Τρίγφνο
Ορθογώνιο
Δάνειο Φοιηηηικό
Καηαναλφηικό
Σηεγαζηικό
Υπάλληλος Πλήροσς Απαζτόληζης
Μερικής Απαζτόληζης
Λογαριαζμός Όυεφς
Ταμιεσηηρίοσ
Φίλιεπ ρσμαοςήρειπ
friend Rectangle duplicate (const Rectangle ¶m);
}; // τέλος της κλάσης Rectangle
Rectangle duplicate(const Rectangle ¶m)
{
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; νονηαρ ιδιωηικά ή πποζηαηεςμένα
} μέλη.
Φίλιεπ κλάρειπ
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;
}
Ανίζει μα ρημειχθεί όςι ρςημ αουή ςξσ ποξγοάμμαςξπ σπάουει κεμή δήλχρη ςηπ
κλάρηπ Square. Η δήλχρη είμαι απαοαίςηςη διόςι η κλάρη Rectangle
υοηριμξπξιεί ςη Square (χπ παοάμεςοξ ρςξ μέλξπ convert) και η Square
υοηριμξπξιεί ςη Rectangle (δηλώμξμςάπ ςημ χπ τίλια).
Φίλιεπ κλάρειπ
Δεμ σπάουει αμξιβαιόςηςα ρςημ έμμξια ςηπ τίλιαπ κλάρηπ, καθώπ ςξ πξιξπ
είμαι τίλιξπ ποξπ πξιξμ καθξοίζεςαι οηςά και δεμ σπξμμξείςαι: Σςξ
παοάδειγμα η κλάρη Rectangle θεχοείςαι τίλια ςηπ κλάρηπ Square, αλλά η
Square δε θεχοείςαι τίλια από ςη Rectangle. Καςά ρσμέπεια, ξι
ρσμαοςήρειπ-μέλη ςηπ κλάρηπ Rectangle μπξοξύμ μα έυξσμ ποόρβαρη ρςα
ιδιχςικά και ποξρςαςεσμέμα μέλη ςηπ Square αλλά όυι ςξύμπαλιμ.
Δνσπακξύεςαι όςι ρε πεοίπςχρη πξσ η Square δηλχθεί τίλια κλάρη ςηπ
Rectangle, απξκςά ςη ρυεςική ποόρβαρη.
Πλεξμεκςήμαςα:
•Οι παοαγόμεμεπ κλάρειπ μπξοξύμ μα αλλάνξσμ ςιπ ςιμέπ ςχμ πεδίχμ απ’ εσθείαπ.
•Υπάουει μικοή βελςίχρη ςηπ ςαυύςηςαπ καθώπ απξτεύγεςαι η κλήρη ςχμ μεθόδχμ
set/get.
Μειξμεκςήμαςα:
•Δεμ ποξρτέοξμςαι για έλεγυξ εγκσοόςηςαπ ςιμώμ, καθώπ η παοαγόμεμη κλάρη
μπξοεί μα δώρει μη-επιςοεπςή ςιμή.
•Δημιξσογία ρυέρεχμ ενάοςηρηπ:
–Οι μέθξδξι ςηπ παοαγόμεμηπ κλάρηπ είμαι πιξ πιθαμόμ ςώοα μα εναοςώμςαι από
ςημ σλξπξίηρη ςηπ βαρικήπ κλάρηπ.
–Δάμ αλλάνει η σλξπξίηρη ςηπ βαρικήπ κλάρηπ μπξοεί μα υοειαρςεί μα
ςοξπξπξιήρξσμε και ςημ παοαγόμεμη κλάρη.
Κληοξμξμικόςηςα
void withdraw(float money)
{
if (money <= balance) balance = balance – money;
else
cout << “Τξ πξρό αμάληφηπ σπεοβαίμει ςξ ςοέυξμ!” << endl;
}
void deposit(float money)
{
balance += money;
}
float getBalance()
{
return balance;
}
}; // τέλος της κλάσης account
Κληοξμξμικόςηςα
Σςξ ποξηγξύμεμξ παοάδειγμα ξοίζξμςαι δύξ κλάρειπ, η Account και η AccInter.
Η ποόςαρη
class AccInter : public Account
καθξοίζει ςη ρχέρη ςηπ κληοξμξμικόςηςαπ. Η AccInter είμαι η παοάγωγη κλάρη
και κληοξμξμεί όλεπ ςιπ δσμαςόςηςεπ ςηπ βαρικήπ κλάρηπ Account.
Σςη main() δημιξσογξύμε έμα αμςικείμεμξ ςηπ κλάρηπ AccInter:
AccInter a1;
Σςξ αμςικείμεμξ δίμεςαι αοχική ςιμή 0, αμ και δεμ σπάοχει ρσμάοςηρη
εγκαςάρςαρηπ ρςημ κλάρη AccInter. Όςαμ δεμ σπάοχει ρσμάοςηρη
εγκαςάρςαρηπ ρςημ παοάγωγη κλάρη, χοηριμξπξιείςαι η ρσμάοςηρη
εγκαςάρςαρηπ από ςη βαρική κλάρη.
Κληοξμξμικόςηςα
Πίμακαπ ποξρπελαριμόςηςαπ
(η παοάγωγη κλάρη παοάγεςαι με δημόρια ποόρβαρη)
Μέλη βαρικήπ Ποξρπελάριμα Ποξρπελάριμα Ποξρπελάριμα
κλάρηπ από ςη δική από ςημ από
ςηπ κλάρη παοάγχγη αμςικείμεμα
κλάρη ένχ από ςημ
κλάρη
public μαι μαι μαι
protected μαι μαι όυι
private μαι όυι όυι
Κληοξμξμικόςηςα
Παοάδειγμα: (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
Κληοξμξμικόςηςα
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();
}
Κληοξμξμικόςηςα
Σσμαοςήρειπ δόμηρηπ ςηπ παοάγωγηπ κλάρηπ
Σςξ ποξηγξύμεμξ ποόγοαμμα, εάμ θελήρξσμε μα απξδώρξσμε αουική ςιμή ρςξ αμςικείμεμξ a1 ςηπ
παοάγχγηπ κλάρηπ ασςό δε θα είμαι ετικςό, γιαςί εμώ ξ μεςαγλχςςιρςήπ υοηριμξπξιεί μία
ρσμάοςηρη δόμηρηπ από ςη βαρική κλάρη όςαμ είμαι υχοίπ ξοίρμαςα, δεμ μπξοεί μα ςξ κάμει για
ρσμαοςήρειπ με ξοίρμαςα. Για μα ςξ πεςύυξσμε ασςό, ποέπει μα γοάφξσμε ρσμαοςήρειπ δόμηρηπ
για ςημ παοάγχγη κλάρη.
Κληοξμξμικόςηςα
Παοόμξια, με ςη δήλχρη
AccInter a2(100);
εκςελείςαι η ποόςαρη
AccInter(float bal) : Account(bal)
όπξσ καλείςαι η ρσμάοςηρη δόμηρηπ AccInter() με έμα
όοιρμα. Ασςή με ςη ρειοά ςηπ καλεί ςημ αμςίρςξιυη
ρσμάοςηρη Account() με έμα όοιρμα και ςηπ μεςαβιβάζει ςξ
όοιρμα, για μα απξδξθεί χπ αουική ςιμή ρςξ αμςικείμεμξ.
Κληοξμξμικόςηςα
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
Κληοξμξμικόςηςα
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() ςηπ βαρικήπ κλάρηπ μέρα
από ςιπ αμςίρςξιυεπ ρσμαοςήρειπ ςηπ παοάγχγηπ κλάρηπ, υοηριμξπξιείςαι ξ
ςελερςήπ διάκοιρηπ εμβέλειαπ ::, αλλιώπ ξι ρσμαοςήρειπ θα καλξύραμ ςξμ
εασςό ςξσπ και ασςό θα ξδηγξύρε ςξ ποόγοαμμα ρε απξςσυία.
Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ
Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ
Κληοξμξμικόςηςα
Σσμδσαρμξί ποξρπέλαρηπ
Σςξ ποόγοαμμα ξοίζεςαι μία βαρική κλάρη A όπξσ δηλώμξμςαι ιδιχςικά,
ποξρςαςεσμέμα και δημόρια δεδξμέμα. Δπίρηπ με βάρη ςημ κληοξμξμικόςηςα,
ξοίζξμςαι ςοειπ παοάγχγεπ κλάρειπ: Η B πξσ παοάγεςαι δημόρια, η C πξσ
παοάγεςαι ιδιχςικά και η D πξσ παοάγεςαι ποξρςαςεσμέμα.
Δίδαμε ποιμ όςι ξι ρσμαοςήρειπ-μέλη ςχμ παοάγχγχμ κλάρεχμ μπξοξύμ
μα ποξρπελάρξσμ ποξρςαςεσμέμα και δημόρια δεδξμέμα ςηπ βαρικήπ κλάρηπ.
Δπίρηπ, αμςικείμεμα ςηπ παοάγχγηπ κλάρηπ δεμ μπξοξύμ μα ποξρπελάρξσμ
ποξρςαςεσμέμα και ιδιχςικά δεδξμέμα ςηπ βαρικήπ κλάρηπ.
Αμςικείμεμα ςηπ παοάγχγηπ κλάρηπ μπξοξύμ μα ποξρπελάρξσμ
δημόρια δεδξμέμα ςηπ βαρικήπ κλάρηπ, μόμξμ ετόρξμ η κλάρη παοάγεςαι
δημόρια (π.υ. η B).
Αμςικείμεμα παοάγχγηπ κλάρηπ πξσ παοάγεςαι ιδιχςικά (π.υ. η C) δεμ
μπξοξύμ μα ποξρπελάρξσμ ξύςε δημόρια δεδξμέμα ςηπ βαρικήπ κλάρηπ.
Αμ δε δώρξσμε κάπξιξμ καθξοιρςή ποξρπέλαρηπ όςαμ δημιξσογξύμε
μία κλάρη, σπξςίθεςαι όςι είμαι ιδιχςικόπ (private).
class A
{};
class B : public A
{};
class C : public B
{};
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.
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΣΜΗΜΑ Μ ΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗ ΣΕ
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;
Πξλλαπλή κληοξμξμικόςηςα
class Rectangle : public Polygon, public Output
{
public:
Rectangle (int a, int b) : Polygon(a,b)
{}
int area ()
{
return width*height;
}
}; // τέλος της κλάσης Rectangle
Πξλλαπλή κληοξμξμικόςηςα
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>
class Borrow
{
private:
char studname[20];
char bdate[10];
public:
Borrow()
{
strcpy(studname, " ");
strcpy(bdate, " ");
} theory_5_aggreg_1.cpp
Πεοιεκςικόςηςα
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;
}
Πεοιεκςικόςηςα
main()
{
Book bk1(1445, "C++ Programming", Borrow("SPANOS",
"13/12/13")), bk2;
bk1.printData();
cout << endl;
bk2.readData();
cout << endl;
bk2.printData();
}
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
Περιεχόμενα ενότητασ
1. Δείκςεπ
2. Δείκςεπ – δσμαμική διαυείοιρη μμήμηπ
3. Δείκςεπ για αμςικείμεμα
4. Πίμακεπ δεικςώμ ποξπ αμςικείμεμα
5. Ο δείκςηπ this
6. Πξλσμξοτιρμόπ (Polymorphism)
7. Κλήρη ρσμαοςήρεωμ ςηπ βαρικήπ κλάρηπ από αμςικείμεμα ςηπ παοαγόμεμηπ
κλάρηπ
8. Δείκςηπ ςηπ παοάγωγηπ κλάρηπ ρε αμςικείμεμξ ςηπ βαρικήπ κλάρηπ
9. Κλήρη ρσμάοςηρηπ παοάγωγηπ κλάρηπ
μέρω δείκςη βαρικήπ κλάρηπ
10. Εικξμικέπ ρσμαοςήρειπ (virtual functions)
11. Εικξμικέπ και μη εικξμικέπ ρσμαοςήρειπ
12. Γμήριεπ εικξμικέπ ρσμαοςήρειπ
13. Ατηοημέμεπ κλάρειπ
14. Μελέςη πεοίπςωρηπ εικξμικώμ ρσμαοςήρεωμ
15. Εικξμικέπ ρσμαοςήρειπ απξδόμηρηπ
16. Μελέςη πεοίπςωρηπ πξλσμξοτιρμξύ
Δείκςεπ
Δάμ καςά ςη δήλχρη εμόπ δείκςη επιθσμξύμε μα μημ έυει αποξρδιόοιρςη ςιμή,
ςόςε ςξμ αουικξπξιξύμε ρςξ NULL και όυι ρςξ 0:
Δείκςεπ
#include <cstdlib>
#include <iostream>
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
Ο δείκςηπ this
Οι ρσμαοςήρειπ-μέλη κάθε αμςικειμέμξσ έυξσμ ποόρβαρη ρε έμαμ «αόοαςξ»
δείκςη πξσ ξμξμάζεςαι this. Έςρι κάθε ρσμάοςηρη-μέλξπ μπξοεί μα αμακαλύφει
ςη διεύθσμρη ςξσ αμςικειμέμξσ ρςξ ξπξίξ αμήκει. Δπιπλέξμ ξ δείκςηπ this
μπξοεί μα υοηριμξπξιηθεί όπχπ κάθε άλλξπ δείκςηπ για κάπξιξ αμςικείμεμξ και
έςρι μπξοεί μα ποξρπελάρει δεδξμέμα ρςξ αμςικείμεμξ πξσ αματέοεςαι.
Βέβαια, για λόγξσπ εσκξλίαπ ρσμήθχπ η αματξοά ρςα δεδξμέμα ασςά γίμεςαι
άμερα, παοαλείπξμςαπ ςξμ δείκςη this. Μία πιξ ποακςική υοήρη ςξσ this
ποξκύπςει όςαμ μία ρσμάοςηρη-μέλξπ εμόπ αμςικειμέμξσ θέλει μα επιρςοέφει
ςξ αμςικείμεμξ πξσ ςημ έυει καλέρει.
Γεμικά μπξοξύμε μα ιρυσοιρςξύμε όςι, για λόγξσπ καςαμόηρηπ, είμαι ρχρςό μα
γίμεςαι η υοήρη ςξσ δείκςη this. Για λόγξσπ όμχπ ξικξμξμίαπ είμαι ποξςιμόςεοξ
μα παοαλείπεςαι και η αματξοά ρςα δεδξμέμα ςξσ αμςικειμέμξσ μα γίμεςαι
άμερα.
Ο δείκςηπ 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;
}
};
main()
{
Employee emp(1000,1);
emp.showAddress();
cout << "The salary is: " << emp.calcSalary() << endl;
}
Πξλσμξοτιρμόπ (Polymorphism)
Αματέοεςαι ρςη δσμαςόςηςα μα ρσμδσάζξσμε πξλλά
πεοιευόμεμα ρε έμα όμξμα ρσμάοςηρηπ μέρχ ςξσ μηυαμιρμξύ
ςηπ δσμαμικήπ ρύμδερηπ. Δπξμέμχπ πξλσμξοτιρμόπ, δσμαμική
ρύμδερη και εικξμικέπ ρσμαοςήρειπ είμαι ξσριαρςικά
εκτάμρειπ ςηπ ίδιαπ έμμξιαπ, όπχπ θα αμαλύρξσμε
ακξλξύθχπ.
Απαιςείςαι η ύπαονη μίαπ ιεοαουίαπ κλάρεχμ.
Χοηριμξπξιξύμε αμςικείμεμα πξσ αμήκξσμ ρςημ ίδια ιεοαουία
κλάρεχμ χπ μα ήςαμ όλα αμςικείμεμα ςηπ βαρικήπ κλάρηπ.
Δπιςοέπει ςημ απξςελερμαςική επέκςαρη ςχμ ποξγοαμμάςχμ,
καθώπ μέεπ κλάρειπ μπξοξύμ εύκξλα μα ποξρςεθξύμ και μα
σπξρςξύμ επενεογαρία όπχπ και ξι σπάουξσρεπ.
theory_6_polym_1.cpp
main()
{
Point point(30, 50);
Circle *circlePtr;
circlePtr = &point;
}
theory_6_polym_2.cpp
theory_6_polym_3.cpp
theory_6_polym_3.cpp
theory_6_vf_1.cpp
Δικξμικέπ ρσμαοςήρειπ
main( )
{
Par1 p1;
Par2 p2;
A *ptr;
ptr = &p1;
ptr→display();
ptr = &p2;
ptr→display();
}
H βαρική κλάρη A και ξι δύξ παοάγχγεπ ςηπ A, Par1 και Par2 έυξσμ μία
ρσμάοςηρη με ςξ ίδιξ όμξμα, display(). Oι ρσμαοςήρειπ ποξρπελαύμξμςαι με
υοήρη δεικςώμ. Θα ποέπει μα ρημειχθεί όςι ρςη βαρική κλάρη μποξρςά από ςξ
δηλχςικό ςηπ ρσμάοςηρηπ έυει ποξρςεθεί η δερμεσμέμη λένη virtual.
Δικξμικέπ ρσμαοςήρειπ
Όςαμ ξ ξοιρμόπ μίαπ εικξμικήπ ρσμάοςηρηπ αλλάζει μέρα ρε μία παοάγχγη
κλάρη, ςόςε αματέοεςαι όςι ξ ξοιρμόπ ρσμάοςηρηπ σπεοβαίμεςαι (overridden).
Σςη βιβλιξγοατία ςηπ C++ γίμεςαι διαυχοιρμόπ μεςανύ ςχμ ξοίχμ
επαμαποξρδιξοιρμόπ και σπέοβαρη.
Και ξι δύξ όοξι αματέοξμςαι ρςημ αλλαγή ςξσ ξοιρμξύ μίαπ ρσμάοςηρηπ μέρα
ρε μία παοάγχγη κλάρη. Αμ η ρσμάοςηρη είμαι μία εικξμική ρσμάοςηρη, ασςή
η εμέογεια καλείςαι σπέοβαρη. Αμ η ρσμάοςηρη δεμ είμαι μία εικξμική
ρσμάοςηρη, καλείςαι επαμαποξρδιξοιρμόπ. Οι δύξ ασςέπ πεοιπςώρειπ
αμςιμεςχπίζξμςαι διατξοεςικά από ςξμ μεςαγλχςςιρςή.
Η εικξμικέπ ρσμαοςήρειπ κληοξμξμξύμςαι, επξμέμχπ θεχοξύμςαι εικξμικέπ και
ρε επόμεμξ επίπεδξ κληοξμξμικόςηςαπ.
Δικξμικέπ ρσμαοςήρειπ
Πόςε υοηριμξπξιείςαι μία εικξμική ρσμάοςηρη:
Δίμαι ταμεοό όςι ξι εικξμικέπ ρσμαοςήρειπ έυξσμ πλεξμεκςήμαςα και γι‟ ασςόμ
ςξμ λόγξ ρςη Java όλεπ ξι ρσμάοςήρειπ είμαι εικξμικέπ. Ωρςόρξ σπάουει έμα
μεγάλξ λειςξσογικό κόρςξπ μεςαςοέπξμςαπ μία ρσμάοςηρη ρε εικξμική, επειδή
έςρι υοηριμξπξιείςαι πεοιρρόςεοη μμήμη και ςξ ποόγοαμμα εκςελείςαι πιξ αογά
από όρξ θα εκςελείςξ εάμ η ρσμάοςηρη δεμ ήςαμ εικξμική.
Ασςή είμαι η αιςία πξσ ξι ρυεδιαρςέπ ςηπ C++ έδχραμ ρςξμ ποξγοαμμαςιρςή ςξμ
έλεγυξ μα απξταρίζει πξιεπ ρσμαοςήρειπ μέλη είμαι εικξμικέπ και πξιεπ όυι.
Σςημ πεοίπςχρη πξσ η ςαυύςηςα είμαι ρημαμςικόπ παοάγξμςαπ, ςόςε η υοήρη
εικξμικώμ ρσμαοςήρεχμ ποέπει μα γίμεςαι με τειδώ.
Πάμτως θα πρέπει μα σημειωθεί ότι η ιδιότητα τωμ εικομικώμ συμαρτήσεωμ
επιτρέπει σε έμα πρόγραμμα μα καλέσει συμαρτήσεις που δεμ υφίσταμται καμ
τημ ώρα που ο κώδικας μεταγλωττίζεται.
Δικξμικέπ ρσμαοςήρειπ
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;
}
};
Δικξμικέπ ρσμαοςήρειπ
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();
}
Ατηοημέμεπ κλάρειπ
•Μία κλάρη πξσ πεοιέυει ςξσλάυιρςξμ μία γμήρια εικξμική ρσμάοςηρη
ξμξμάζεςαι ατηοημέμη κλάρη (abstract class). Μία ατηοημέμη κλάρη μπξοεί
μα υοηριμξπξιηθεί απξκλειρςικά χπ βαρική κλάρη για ςημ παοαγχγή άλλχμ
κλάρεχμ. Δεμ μπξοξύμ μα δημιξσογηθξύμ αμςικείμεμα μίαπ ατηοημέμηπ
κλάρηπ καθώπ δεμ σπάουει πλήοηπ ξοιρμόπ κλάρηπ. Μία ατηοημέμη κλάρη
έυει μεοικό ξοιρμό κλάρηπ, διόςι μπξοεί μα πεοιέυει χπ μέλη ρσμαοςήρειπ πξσ
δεμ είμαι γμήριεπ εικξμικέπ ρσμαοςήρειπ.
•Δάμ παοαυθεί μία κλάρη από ατηοημέμη κλάρη, η παοαγόμεμη κλάρη είμαι
και η ίδια ατηοημέμη, εκςόπ εάμ γοατξύμ ξοιρμξί για όλεπ ςιπ
κληοξμξμξύμεμεπ γμήριεπ εικξμικέπ ρσμαοςήρειπ και παοάλληλα δεμ
ειραυθξύμ μέεπ γμήριεπ εικξμικέπ ρσμαοςήρειπ.
Employee
BasePlusCommissionEmployee
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 // 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
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
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 }
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 }
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
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
Ενότητα
ΑΝΣΙΚΕΙΜΕΝΟΣΡΑΦΗ ΠΡΟΓΡΑΜΜΑΣΙΜΟ
Η ΚΛΑΣΗ 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;
}
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 str1;
cin >> str1;
• #include<iostream>
– Βιβλιξθήκη για είρξδξ / ένξδξ.
• #include<iomanip>
– Βιβλιξθήκη για C++ manipulators. Γεμικά υοήριμη βιβλιξθήκη.
• #include<fstream>
– Βιβλιξθήκη για είρξδξ / ένξδξ με υοήρη αουείωμ.
Παοάδειγμα:
ΕΞΟΔΟ Ε ΑΡΥΕΙΟ
// Ένξδξπ δεδξμέμωμ ρε αοχείξ
#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);
} Στην οθόνη τσπώνεται:
• seekg ( pos_type_position );
seekp ( pos_type_position );
Αλλάζξσμ ςη θέρη πξσ βοιρκόμαρςε ρςξ αουείξ καςά ρςαθεοό βήμα ίρξ με ςημ ςιμή
pos_type_position και ρε ρυέρη με ςημ αουή ςξσ αουείξσ
ΠΑΡΑΔΕΙΓΜΑ
// Υπξλξγιρμόπ μεγέθξσπ 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 αοχείξ
#include <iostream.h>
#include <fstream.h>
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.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
• 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
Sally Black
Tom Blue
Judy Green File
Iris Orange
Randy Red
1 Bit
• 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_fstream
• File-open modes
Mode Description
• 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
• Operations
– Writing to file (just like cout)
• outClientFile << myVariable
– Closing file
• outClientFile.close()
• Automatically closed when destructor called
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
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)
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
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
? 4 fig14_08.cpp
End of run. output (2 of 2)
• 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
} byte offsets
}
}
}
}
}
}
• 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
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)
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)
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 ) { 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)
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
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)
• 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)