Verwendung von private vs. protected Klassenmitgliedern in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung der Eigenschaft private zur Kennzeichnung von Klassenmitgliedern, die für Benutzer der Klasse in C++ unzugänglich sind
  2. Verwenden Sie die Eigenschaft protected, um die Klassenmitglieder zu kennzeichnen, auf die Memberfunktionen einer abgeleiteten Klasse oder einer Freundesklasse zugreifen können
Verwendung von private vs. protected Klassenmitgliedern in C++

In diesem Artikel werden mehrere Methoden zur korrekten Verwendung von private vs. protected Klassenmitgliedern in C++ vorgestellt.

Verwendung der Eigenschaft private zur Kennzeichnung von Klassenmitgliedern, die für Benutzer der Klasse in C++ unzugänglich sind

Das Schlüsselwort private ist einer der grundlegenden Bestandteile der Sprache C++ zur Implementierung von Kapselungsfunktionen. Das Hauptziel der Kapselung besteht darin, eine erzwungene Schnittstelle für die Benutzer der Klasse zu schaffen und den direkten Zugriff auf nur bestimmte Mitglieder zu beschränken. Beachten Sie, dass die Definition der Klassenschnittstelle impliziert, dass der Benutzer der Klasse die Datenmitglieder nicht direkt ändern oder darauf zugreifen muss, sondern öffentliche Methoden aufruft, die diese Operationen an den gegebenen Objekten durchführen sollen.

Im Allgemeinen gibt es drei Schlüsselwörter für die Zugriffskontrolle: public, private und protected. Mitglieder, die nach der Eigenschaft public definiert sind, sind für alle Benutzer der Klasse zugänglich. Auf der anderen Seite definiert der Spezifizierer private die Mitglieder, auf die nur von den Mitgliedsfunktionen der Klasse zugegriffen werden kann. Im folgenden Beispiel kann der Code der Funktion main eine Variable vom Typ CustomString deklarieren, aber um auf ihr Mitglied str zuzugreifen, muss der Code die Methode getString aufrufen, die als Eigenschaft public definiert ist.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  CustomString() = default;
  explicit CustomString(const string& s) : str(s) { num = s.size(); }

  virtual ~CustomString() = default;

  string& getString() { return str; };

 private:
  string str;

 protected:
  int num{};
};

int main() {
  CustomString str1("Hello There 1");

  cout << "str1: " << str1.getString() << endl;

  exit(EXIT_SUCCESS);
}

Ausgabe:

str1: Hello There 1

Verwenden Sie die Eigenschaft protected, um die Klassenmitglieder zu kennzeichnen, auf die Memberfunktionen einer abgeleiteten Klasse oder einer Freundesklasse zugreifen können

Ein weiteres Schlüsselwort, das für die Zugriffskontrolle zur Verfügung steht, ist die Eigenschaft protected, die die danach deklarierten Member für Memberfunktionen der Klasse, abgeleitete Klassenmitglieder und sogar Freundesklassen zugänglich macht. Beachten Sie, dass die beiden letztgenannten nicht direkt vom Objekt der Basisklasse auf die protected-Mitglieder zugreifen können, sondern nur vom Objekt der abgeleiteten Klasse. Das nächste Beispiel zeigt die Klasse CustomSentence, die von der Klasse CustomString abgeleitet ist, aber das Member num der letzteren Klasse ist ein protected Member. Daher kann es nicht vom CustomString-Objekt aus angesprochen werden. Die Funktion getSize ist nämlich nicht Teil der Klasse CustomString, und nur CustomSentence-Objekte können den Wert num durch Aufruf der Methode abrufen.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  CustomString() = default;
  explicit CustomString(const string& s) : str(s) { num = s.size(); }

  virtual ~CustomString() = default;

  string& getString() { return str; };

 private:
  string str;

 protected:
  int num{};
};

class CustomSentence : public CustomString {
 public:
  CustomSentence() = default;
  explicit CustomSentence(const string& s) : sent(s) { num = s.size(); }
  ~CustomSentence() override = default;

  int getSize() const { return num; };
  string& getSentence() { return sent; };

 private:
  string sent;
};

int main() {
  CustomString str1("Hello There 1");
  CustomSentence sent1("Hello There 2");

  cout << "str1: " << str1.getString() << endl;
  cout << "sent1: " << sent1.getSentence() << endl;
  cout << "size: " << sent1.getSize() << endl;

  exit(EXIT_SUCCESS);
}

Ausgabe:

str1: Hello There 1
sent1: Hello There 2
size: 13
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Class