Εισαγωγή Δεδομένων σε Κλάση
Επικοινωνία με την κλάση
Για να καλέσουμε μία συνάρτηση-μέλος από το κυρίως πρόβλημα, χρησιμοποιούμε την αναφορά στο αντικείμενο:
<όνομα αντικειμένου>.<όνομα συνάρτησης-μέλους>
Παράδειγμα:
#include <iostream.h>
using namespace std;
class Cat
{
public:
int itsAge;
int itsWeight;
};
void main()
{
Cat Frisky;
Frisky.itsAge = 5;
cout << "Frisky is a cat who is " ;
cout << Frisky.itsAge << " years old.\n";
}
Στο παραδειγμα αυτο, δημιουργούμε ένα αντικείμενο Frisky της κλάσης Cat και προσπελαύνουμε το μέλος itsAge μέσω του τελεστή ..
Πρόσβαση σε στοιχεία κλάσης
- Εάν δεν διευκρινιστεί ο τύπος των δεδομένων στην κλάση, ο εξ' ορισμού τύπος είναι
private. - Στα
privateδεδομένα δεν μπορούμε να έχουμε πρόσβαση εκτός κλάσης. Αυτό συμβαίνει για την ασφάλεια των δεδομένων. - Για το λόγο αυτό, πρέπει να δημιουργήσουμε κατάλληλες συναρτήσεις για εργασίες όπως:
- Απόδοση τιμής σε μεταβλητή
- Επιστροφή δεδομένων
Τελεστής Εμβέλειας ::
Όταν δηλώνουμε πρότυπο συνάρτησης μέσα σε μία κλάση και θέλουμε να ορίσουμε τη συνάρτηση εκτός κλάσης, πρέπει να χρησιμοποιήσουμε τον Τελεστή Εμβέλειας ::.
Παράδειγμα:
class foo {
...
int sum(void);
};
int foo::sum(void) {
int sum=0;
for (int i=0;i<foo::i;i++) {
sum += a[i];
}
return(sum);
}
Στο παραδειγμα αυτό, η συνάρτηση sum δηλώνεται μέσα στην κλάση foo αλλά ορίζεται εκτός της κλάσης, χρησιμοποιώντας τον τελεστή εμβέλειας ::.
Απόδοση τιμής σε μεταβλητή
Υπάρχουν συναρτήσεις που χρησιμοποιούνται για να αποδώσουν τιμή σε private μεταβλητή μιας κλάσης. Συνήθως ονομάζονται Set_<όνομα μεταβλητής>.
Παράδειγμα:
class Cat {
public:
void SetAge (int age);
void Meow();
private:
int itsAge;
};
…
void Cat::SetAge(int age) {
itsAge = age;
}
…
Η συνάρτηση SetAge χρησιμοποιείται για να ορίσει την τιμή της private μεταβλητής itsAge.
Επιστροφή δεδομένων
Υπάρχουν συναρτήσεις που χρησιμοποιούνται για να μεταφέρουν μια private μεταβλητή εκτός κλάσης. Συνήθως ονομάζονται Get_<όνομα μεταβλητής>.
Παράδειγμα:
class Cat {
public:
void SetAge (int age);
int GetAge();
void Meow();
private:
int itsAge;
};
…
int Cat::GetAge() {
return itsAge;
}
…
Η συνάρτηση GetAge χρησιμοποιείται για να επιστρέψει την τιμή της private μεταβλητής itsAge.
Πλήρες Παράδειγμα Προγράμματος
#include <iostream>
using namespace std;
class Cat {
public:
int GetAge();
void SetAge (int age);
void Meow();
private:
int itsAge;
};
int Cat::GetAge() {
return itsAge;
}
void Cat::SetAge(int age) {
itsAge = age;
}
void Cat::Meow() {
cout << "Meow.\n";
}
int main() {
Cat Frisky;
Frisky.SetAge(5);
Frisky.Meow();
cout << "Frisky is a cat who is " ;
cout << Frisky.GetAge() << " years old.\n";
Frisky.Meow();
return 0;
}
Έξοδος:
Meow.
Frisky is a cat who is 5 years old.
Meow.
Αρχικοποίηση κλάσης (Constructors)
Οι classes περιλαμβάνουν μια ιδιαίτερη συνάρτηση-μέλος που ονομάζεται constructor (δομητής).
- Ο constructor έχει το ίδιο όνομα με την κλάση.
- Μπορεί να παίρνει παράμετρο αν χρειάζεται αλλά δεν έχει τύπο επιστροφής, ούτε καν void.
Παράδειγμα:
class Date {
public:
Date(int d, int m, int y);
// . . .
};
Date::Date(int d, int m, int y) : day(d), month(m), year(y) {
}
Μεγάλο πλεονέκτημα των ΔΟΜΗΤΩΝ είναι το ότι η ύπαρξή τους απομακρύνει την πιθανότητα μη αρχικοποιημένων μεταβλητών. Αν έχει δηλωθεί η Date(int, int, int) τότε η Date d; είναι λάθος.
Στις κλάσεις μπορεί να ορίζονται περισσότεροι από ένας δομητές αλλά μόνο ένας από αυτούς θα είναι ο προκαθορισμένος (default).
class Date {
public:
Date();
Date(int d, int m, int y);
Date(String);
. . .
};
Date::Date(int d, int m, int y) : day(d), month(m), year(y) {
if (year == 0) year = current year;
}
Destructor (αποδομητής)
Όταν δημιουργούμε ένα constructor, δημιουργούμε και ένα Destructor (αποδομητής).
- Δεν έχει παραμέτρους και δεν επιστρέφει τίποτα.
- Πρέπει να αποδεσμεύσει τη δεσμευμένη μνήμη (memory) και να καθαρίσει την κλάση.
- Ο destructor έχει τη μορφή:
~ClassName() {…}
Παραδείγματα
Παράδειγμα 1
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area() {return width*height;}
};
void Rectangle::set_values (int x, int y) {
width = x;
height = y;
}
int main () {
Rectangle rect;
rect.set_values (3,4);
cout << "area: " << rect.area();
return 0;
}
Παράδειγμα 2
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area () {return width*height;}
};
void Rectangle::set_values (int x, int y) {
width = x;
height = y;
}
int main () {
Rectangle rect, rectb;
rect.set_values (3,4);
rectb.set_values (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
Παράδειγμα 3
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
Rectangle (int,int);
int area () {return (width*height);}
};
Rectangle::Rectangle (int a, int b) {
width = a;
height = b;
}
int main () {
Rectangle rect (3,4);
Rectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}