Προγραμματισμός Ι Κλάσεις και Αντικείμενα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο
Κλάσεις Η γενική μορφή μιας κλάσης είναι η εξής: class class-name { private data and functions access-specifier: data and functions access-specifier: data and functions //... access-specifier: data and functions } object-list; Χαροκόπειο Πανεπιστήμιο 2/22
Κλάσεις η χρήση του object-list είναι προαιρετική access-specifier είναι ένα από τα public, προσβάσιμα από όλα τα μέρη ενός προγράμματος private, προσβάσιμα μόνο από μεθόδους της συγκεκριμένης κλάσης protected, χρησιμοποιείται μόνο όταν υπάρχει κληρονομικότητα τα δεδομένα και οι συναρτήσεις στην κορυφή της κλάσης είναι από προεπιλογή private Χαροκόπειο Πανεπιστήμιο 3/22
Παράδειγμα 1 class Employee { 2 char * name ; 3 4 public : 5 Employee ( ) ; 6 ~Employee ( ) ; 7 8 char *getname ( ) ; 9 void setname ( char *name ) ; 10 } ; 11 12 int main ( ) { 13 Employee a ; 14 15 a. name = "Kwstas" ; / / NO COMPILE ERROR! 16 a. setname ( "Kwstas" ) ; / / OK! 17 } Χαροκόπειο Πανεπιστήμιο 4/22
Struct στην C++ Στην C++ ένα struct είναι ουσιαστικά μια κλάση η οποία έχει πρόσβαση public παντού. 18 #include <iostream > 19 #include <cmath> 20 21 struct complex { 22 double real, img ; 23 24 void set ( double r, double i ) { 25 real = r ; 26 img = i ; 27 } 28 29 void print ( ) { 30 std : : cout << real ; 31 if ( img < 0) 32 std : : cout << "-" ; 33 else if ( img > 0) 34 std : : cout << "+" ; 35 std : : cout << abs ( img ) << "i" ; 36 } 37 } ; Χαροκόπειο Πανεπιστήμιο 5/22
Struct στην C++ Στην C++ ένα struct είναι ουσιαστικά μια κλάση η οποία έχει πρόσβαση public παντού. 38 int main ( ) 39 { 40 complex c1, c2 ; 41 42 c1. set ( 2, 3 ) ; 43 c1. print ( ) ; 44 45 c2. set ( 5, 6 ) ; 46 c2. print ( ) ; 47 48 c1. real = 2 ; 49 c1. print ( ) ; 50 } Χαροκόπειο Πανεπιστήμιο 6/22
Union στην C++ Όπως και οι εγγραφές, τα union στην C++ ορίζουν κλάσεις. Μπορούν δηλαδή να περιέχουν συναρτήσεις, constructor και destructor. Όπως και στην C όλες οι μεταβλητές σε ένα union χρησιμοποιούν τις ίδιες θέσεις μνήμης. Χαροκόπειο Πανεπιστήμιο 7/22
Anonymous Unions Η C++ προσφέρει και ανώνυμα union. Ένα ανώνυμο union δεν περιλαμβάνει όνομα τύπου και δεν μπορούμε να φτιάξουμε μεταβλητές. Λέει όμως στον μεταγλωττιστή πως τα μέλη της πρέπει να μοιράζονται τις ίδιες θέσεις μνήμης. Για να έχουμε πρόσβαση σε ένα μέλος ενός τέτοιου union δεν πρέπει να χρησιμοποιήσουμε τον τελεστή τελείας. Χαροκόπειο Πανεπιστήμιο 8/22
Anonymous Unions Παράδειγμα 1 #include <iostream > 2 3 using namespace std ; 4 5 int main ( ) 6 { 7 union { 8 long l ; 9 double d ; 10 char s [ 4 ] ; 11 } ; 12 13 l = 100000; 14 cout << l << " " ; 15 d = 123.2342; 16 cout << d << " " ; 17 s [ 0 ] = 'a' ; 18 s [ 1 ] = 'b' ; 19 s [ 2 ] = 'c' ; 20 s [ 3 ] = '\0' ; 21 cout << s << endl ; 22 } Χαροκόπειο Πανεπιστήμιο 9/22
Συναρτήσεις Φίλοι Friend Functions Είναι δυνατόν να δώσουμε πρόσβαση στα private μέρη μια κλάσης, σε μια συνάρτηση που δεν είναι μέλος της κλάσης, ορίζοντας την συνάρτηση ως friend. 1 class myclass { 2 int a, b ; 3 4 public : 5 myclass ( ) ; 6 7 friend void print ( myclass x ) ; 8 } ; 9 10 / / Note : p r i n t ( ) i s not a member f u n c t i o n 11 void print ( myclass x ) { 12 cout << x. a << " " < x. b << endl ; 13 } Χαροκόπειο Πανεπιστήμιο 10/22
Κλάσεις Φίλοι Friend Classes Είναι δυνατόν να δώσουμε πρόσβαση στα private μέρη μια κλάσης, σε μια άλλη κλάση (σε όλες τις μεθόδους δηλαδή), ορίζοντας την κλάση ως friend. 1 class TwoValues { 2 int a, b ; 3 4 public : 5 TwoValues ( int i, int j ) { a = i ; b = j ; } 6 7 friend class Min ; 8 } ; 9 10 class Min { 11 public : 12 int min ( TwoValues x ) { 13 return x. a < x. b? x. a : x. b ; 14 } 15 } ; Χαροκόπειο Πανεπιστήμιο 11/22
Ορίζοντας Συναρτήσεις μέσα στις Κλάσεις Είναι δυνατόν να δίνουμε το σώμα μικρών συναρτήσεων απευθείας μέσα στην κλάση που ανήκουν. Σε αυτή την περίπτωση ο μεταγλωττιστής θεωρεί πως θέλουμε να είναι και inline. 1 class Pair { 2 int a, b ; 3 4 public : 5 Pair ( int i, int j ) { a = i ; b = j ; } 6 ~Pair ( ) { } 7 8 int first ( ) { return a ; } 9 int second ( ) { return b ; } 10 11 int min ( ) { return a < b? a : b ; } 12 } ; Χαροκόπειο Πανεπιστήμιο 12/22
Constructors με πολλαπλές παραμέτρους Μπορούμε να έχουμε και constructors με πολλές παραμέτρους. 1 class Complex { 2 double a, b ; 3 4 public : 5 Complex ( ) { a = 0. 0 ; b = 0. 0 ; } 6 Complex ( double real ) { a = real ; b = 0. 0 ; } 7 Complex ( double real, double img ) { a = real ; b = img ; } 8 ~Complex ( ) { } 9 10 double re ( ) { return a ; } 11 double img ( ) { return b ; } 12 } ; Χαροκόπειο Πανεπιστήμιο 13/22
Στατικά Δεδομένα σε Κλάσεις Δίνοντας τον χαρακτηρισμό static σε μια μεταβλητή σε μια κλάση, λέμε στον μεταγλωττιστή πως θέλουμε μόνο ένα αντιγράφο αυτής της μεταβλητής το οποίο πρέπει να είναι κοινό για όλα τα αντικείμενα αυτής της κλάσης. Δηλώνοντας μια static μεταβλητή δεν την ορίζουμε (δεν δεσμεύεται χώρος για την μεταβλητή). Πρέπει στην συνέχεια να παρέχουμε μία καθολική δήλωση εκτός της κλάσης. Χαροκόπειο Πανεπιστήμιο 14/22
Στατικά Δεδομένα σε Κλάσεις 1 class shared 2 { 3 static int a ; 4 int b ; 5 public : 6 void set ( int i, int j ) { a = i ; b = j ; } 7 void show ( ) ; 8 } ; 9 10 int shared : : a ; / / d e f i n e a 11 12 void shared : : show ( ) { 13 cout << "Static a: " << a << endl ; 14 cout << "Non-static b: " << b << endl ; 15 } Χαροκόπειο Πανεπιστήμιο 15/22
Στατικά Δεδομένα σε Κλάσεις int main ( ) { shared x, y ; } ; x. set ( 1, 1 ) ; x. show ( ) ; y. set ( 2, 2 ) ; y. show ( ) ; x. show ( ) ; Το πρόγραμμα θα εκτυπώσει Static a: 1 Non-static b: 1 Static a: 2 Non-static b: 2 Static a: 2 Non-static b: 1 Χαροκόπειο Πανεπιστήμιο 16/22
Στατικά Δεδομένα σε Κλάσεις Μια στατική μεταβλητή υπάρχει πριν δημιουργηθεί κάποιο αντικείμενο της κλάσης. 1 class shared { 2 public : 3 static int a ; 4 } ; 5 6 int shared : : a ; / / d e f i n e a 7 8 int main ( ) { 9 shared : : a = 99; / / before c r e a t i n g any o b j e c t s 10 11 cout << "Initial value of a: " << shared : : a << endl ; 12 13 shared x ; 14 15 cout << "This is x.a: " << x. a << endl ; 16 } Χαροκόπειο Πανεπιστήμιο 17/22
Στατικές Συναρτήσεις σε Κλάσεις Οι συναρτήσεις μέλη μιας κλάσης μπορεί να δηλωθούν static. Τέτοιες συναρτήσεις όμως μπορούν να προσπελάσουν μόνο static δεδομένα της ίδιας κλάσης. 1 class static_type { 2 static int i ; 3 public : 4 static void init ( int x ) { i = x ; } 5 void show ( ) { cout << i ; } 6 } ; 7 8 int static_type : : i ; / / d e f i n e i 9 10 int main ( ) { 11 static_type : : init ( 1 0 0 ) ; 12 13 static_type x ; 14 x. show ( ) ; / / d i s p l a y s 100 15 } Χαροκόπειο Πανεπιστήμιο 18/22
Κλήση Constructors και Destructors Ένας constructor καλείται μόλις ένα αντικείμενο δημιουργείται και ο destructor όταν το αντικείμενο καταστρέφεται. Για τοπικά αντικείμενα, ο constructor καλείται την στιγμή που η αντίστοιχη δήλωση συναντηθεί. Οι destructors καλούνται με την αντίθετη σειρά από την σειρά κλήσης των constructors. Σχετικά με τα καθολικά αντικείμενα οι constructors καλούνται πριν η συνάρτηση main() ξεκινήσει να εκτελείται. Οι constructors καλούνται με την σειρά που έχουν δηλωθεί τα αντικείμενα σε ένα αρχείο. Όταν υπάρχουν πολλά αρχεία δεν μπορούμε να ξέρουμε την ακριβή σειρά εκτέλεσης. Χαροκόπειο Πανεπιστήμιο 19/22
Κλήση Constructors και Destructors 1 class myclass { 2 int who ; 3 public : 4 myclass ( int id ) { 5 cout << "Initializing " << id << endl ; 6 who = id ; 7 } 8 ~myclass ( ) { cout << "Destructing " << id << endl ; } 9 10 } glob_ob1 ( 1 ), glob_ob2 ( 2 ) ; 11 12 int main ( ) { 13 myclass local_ob1 ( 3 ) ; 14 15 cout << "I am not the first line" << endl ; 16 17 myclass local_ob2 ( 4 ) ; 18 } Χαροκόπειο Πανεπιστήμιο 20/22
Κλήση Constructors και Destructors Το προηγούμενο πρόγραμμα τυπώνει Initializing 1 Initializing 2 Initializing 3 I am not the first line Initializing 4 Destructing 4 Destructing 3 Destructing 2 Destructing 1 Χαροκόπειο Πανεπιστήμιο 21/22
Scope Resolution Operator Ο τελεστής :: εκτός από το να προσφέρει πρόσβαση σε μέλη μιας κλάσης, μας επιτρέπει να έχουμε πρόσβαση και σε μεταβλητές όπου έχουν επικαλυφθεί από άλλες μεταβλητές με ίδιο όνομα. 1 2 int i ; / / g l o b a l i 3 4 void f ( ) { 5 int i ; / / l o c a l i ; 6 7 i = 10; / / uses l o c a l i 8 9 : : i = 10; / / uses g l o b a l i 10 } Χαροκόπειο Πανεπιστήμιο 22/22