====== Προσδιοριστές Πρόσβασης ======
Οι προσδιοριστές πρόσβασης επιτρέπουν την απόκρυψη της πληροφορίας που είναι από τις βασικές αρχές του αντικειμενοστραφή προγραμματισμού. Με την έννοια //"απόκρυψη πληροφορίας"// εννοούμε την απόκρυψη της εσωτερικής υλοποίησης της κλάσης.
Σε μία κλάση μπορούν να οριστούν οι προσδιοριστές πρόσβασης //public//, //protected// και //private//. Οι προσδιοριστές πρόσβασης αφορούν τόσο τα πεδία (μεταβλητές) όσο και τις συναρτήσεις (μεθόδους) της κλάσης. Η λειτουργικότητα τους συνοψίζεται στα εξής:
- **public:** Ένα μέλος της κλάσης που δηλώνεται ως //public// είναι προσβάσιμο από οποιαδήποτε άλλη κλάση ή συνάρτηση που δεν ανήκει σε κλάση.
- **protected:** Ένα μέλος της κλάσης που δηλώνεται ως //protected// είναι προσβάσιμο από την κλάση στην οποια δηλώνεται και από τις υποκλάσεις αυτής, καθώς και από τις φιλικές συναρτήσεις (//friend functions//) της κλάσης.
- **private:** Ένα μέλος της κλάσης που δηλώνεται ως //private// είναι προσβάσιμο μόνο από την κλάση στην οποία δηλώνεται και από τις φιλικές συναρτήσεις (//friend functions//) της κλάσης.
Εάν δεν οριστεί προσδιοριστής πρόσβασης σε μία κλάση τα πεδία και οι μέθοδοι της κλάσης ορίζονται ως //private//.
===== Παράδειγμα χρήσης προσδιοριστών πρόσβασης =====
Δείτε το παρακάτω παράδειγμα χρήσης των προσδιοριστών πρόσβασης μέσω των κλάσεων //Cuboid// (κυβοειδές) και //Cube// (κύβος) που κληρονομεί την κλάση //Cuboid//.
#include
using namespace std;
class Cuboid {
private:
int width, height, length;
protected:
int color;
public:
int borderWidth;
public:
Cuboid(int w, int h, int l);
void setWidth(int w);
void setHeight(int h);
void setLength(int l);
int getWidth();
int getHeight();
int getLength();
};
Cuboid::Cuboid(int w, int h, int l) {
width = w; height = h; length = l;
color = 0xffffff;
}
void Cuboid::setWidth(int w) { width = w; }
void Cuboid::setHeight(int h) { height = h; }
void Cuboid::setLength(int l) { length = l; }
int Cuboid::getWidth() { return width; }
int Cuboid::getHeight() { return height; }
int Cuboid::getLength() { return length; }
#include
using namespace std;
#include "Cuboid.hpp"
class Cube:Cuboid { // Cube extends Cuboid
public:
Cube(int s, int updatecolor);
void setSize(int s);
};
Cube::Cube(int s, int updatecolor) : Cuboid(s,s,s) {
color = updatecolor;
}
void Cube::setSize(int s) {
setWidth(s);
//width = s; // this does not compile
setHeight(s);
setLength(s);
}
Η δήλωση class Cube:Cuboid {
δηλώνει ότι τη σχέση κληρονομικότητας μεταξύ των κλάσεων Cube και Cuboid (η κλάση Cube είναι απόγονος της κλάσης Cuboid).
#include "Cube.hpp"
int main() {
Cuboid cuboid(1,2,3);
//cuboid.color = 0xFF0000 // this does not compile
cuboid.borderWidth = 5;
Cube cube(1, 0xcccccc);
cuboid.setWidth(5);
}
Από το παραπάνω παράδειγμα παρατηρούμε τα εξής:
- Τα πεδία //width//, //height// και //length// της κλάσης //Cuboid// είναι ορισμένα ως //private// και δεν είναι ορατά από τη συνάρτηση //main// ή την κλάση //Cube//.
- Το πεδίο //color// είναι ορισμένο ως //protected// και είναι ορατό από την υποκλάση //Cube//, όχι όμως και από τη //main//.
- Η μέθοδος //setWidth// είναι ορισμένη ως //public// και είναι ορατή από τη μέθοδο //main// και από την υποκλάση //Cube//. Το ίδιο ισχύει και για το //public// πεδίο //borderWidth//.