Specyfikatory dostępu C++


Specyfikatory dostępu

Do tej pory dobrze znasz publicsłowo kluczowe, które pojawia się we wszystkich naszych przykładach klas:

Przykład

class MyClass {  // The class
  public:        // Access specifier
    // class members goes here
};

Słowo publickluczowe jest specyfikatorem dostępu. Specyfikatory dostępu definiują, w jaki sposób można uzyskać dostęp do elementów członkowskich (atrybutów i metod) klasy. W powyższym przykładzie członkowie są public- co oznacza, że ​​można uzyskać do nich dostęp i modyfikować je spoza kodu.

Co jednak, jeśli chcemy, aby członkowie byli prywatni i ukryci przed światem zewnętrznym?

W C++ istnieją trzy specyfikatory dostępu:

  • public - członkowie są dostępni spoza klasy
  • private - członkowie nie są dostępni (ani oglądani) spoza klasy
  • protected- nie można uzyskać dostępu do członków spoza klasy, jednak można uzyskać do nich dostęp w klasach dziedziczonych. Więcej o Dziedziczeniu dowiesz się później.

W poniższym przykładzie pokazujemy różnice między publicczłonkami private:

Przykład

class MyClass {
  public:    // Public access specifier
    int x;   // Public attribute
  private:   // Private access specifier
    int y;   // Private attribute
};

int main() {
  MyClass myObj;
  myObj.x = 25;  // Allowed (public)
  myObj.y = 50;  // Not allowed (private)
  return 0;
}

Jeśli spróbujesz uzyskać dostęp do członka prywatnego, wystąpi błąd:

error: y is private

Uwaga: Dostęp do prywatnych członków klasy można uzyskać za pomocą metody publicznej w tej samej klasie. Zobacz następny rozdział ( Enkapsulacja ), jak to zrobić.

Wskazówka: Dobrą praktyką jest deklarowanie atrybutów klasy jako prywatnych (tak często, jak to możliwe). Zmniejszy to możliwość zepsucia kodu przez Ciebie (lub innych). Jest to również główny składnik koncepcji enkapsulacji , o której dowiesz się więcej w następnym rozdziale.

Uwaga: Domyślnie wszyscy członkowie klasy są private, jeśli nie określisz specyfikatora dostępu:

Przykład

class MyClass {
  int x;   // Private attribute
  int y;   // Private attribute
};