====== Προσδιοριστές Πρόσβασης ====== Οι προσδιοριστές πρόσβασης επιτρέπουν την απόκρυψη της πληροφορίας που είναι από τις βασικές αρχές του αντικειμενοστραφή προγραμματισμού. Με την έννοια //"απόκρυψη πληροφορίας"// εννοούμε την απόκρυψη της εσωτερικής υλοποίησης της κλάσης. Σε μία κλάση μπορούν να οριστούν οι προσδιοριστές πρόσβασης //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//.