Zugriff auf private Mitglieder einer Klasse in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung von den Zugriffsspezifizierer private zum Klassenmitglieder in C++ zu kapseln
  2. Verwendung von die Funktionen public zum private Mitglieder einer Klasse in C++ abzurufen
Zugriff auf private Mitglieder einer Klasse in C++

In diesem Artikel werden verschiedene Methoden für den Zugriff auf private Mitglieder einer Klasse in C++ erläutert.

Verwendung von den Zugriffsspezifizierer private zum Klassenmitglieder in C++ zu kapseln

Zugriffsspezifizierer werden verwendet, um ein Kernmerkmal der objektorientierten Programmierung zu implementieren - die sogenannte Kapselung. Infolgedessen beschränken wir den direkten Zugriff auf bestimmte Datenelemente der Klasse und erstellen im Wesentlichen eine Schnittstelle für die Verarbeitung von Klassendaten. Das C++ bietet verschiedene Schlüsselwörter für Zugriffsspezifizierer wie public, private und protected, die normalerweise den Mitgliedern der Klasse vorangehen, die mit entsprechender Barrierefreiheit qualifiziert werden müssen.

Nach dem Bezeichner private definierte Mitglieder sind nur für Mitgliedsfunktionen zugänglich und können nicht direkt aus dem Code referenziert werden, der die Klasse verwendet. Eine Klasse wird normalerweise mit zwei Seiten konstruiert - dem Designer der Klasse und dem Benutzer der Klasse. Letzteres ist normalerweise derjenige, der von der Einkapselung betroffen ist. Wenn der Programmierer Mitglieder vor dem ersten Zugriffsspezifizierer definiert, ist ihre Zugänglichkeit standardmäßig auf private festgelegt, wenn das Schlüsselwort class verwendet wird, und auf public für das Schlüsselwort struct.

Im folgenden Beispiel implementieren wir eine Klasse namens BaseClass mit zwei als private deklarierten String-Datenelementen. Um auf die Werte dieser Elemente zuzugreifen, sollte der Designer der Klasse public-Funktionen enthalten, die sie abrufen. Beachten Sie, dass wir das Schlüsselwort public aus dem folgenden Code entfernen können und weiterhin die Funktionen getUsername und getName als public-Mitglieder haben.

Ein weiterer Vorteil der Kapselung ist die Flexibilität, die interne Klassenstruktur zu ändern, ohne sich um die Kompatibilitätsprobleme der Benutzerseite kümmern zu müssen. Solange sich die Schnittstelle und damit die öffentlichen Funktionen nicht ändern, muss der Benutzer der Klasse seinen Code nicht ändern.

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

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

class BaseClass {
 public:
  BaseClass() = default;
  explicit BaseClass(string user, string nm)
      : username(std::move(user)), name(std::move(nm)) {}

  ~BaseClass() = default;

  string& getUsername() { return username; };
  string& getName() { return name; };

 private:
  string username;
  string name;
};

int main() {
  BaseClass base("buddy", "Buddy Bean");

  cout << "base -> name: " << base.getName() << endl;
  cout << "base -> username: " << base.getUsername() << endl;

  exit(EXIT_SUCCESS);
}

Ausgabe:

base -> name: Buddy Bean
base -> username: buddy

Verwendung von die Funktionen public zum private Mitglieder einer Klasse in C++ abzurufen

Die privaten Mitglieder können unter Verwendung der Klassenschnittstellenfunktionen geändert werden, z. B. übernimmt die Funktion changeUsername das Argument string vom Benutzer der Klasse entgegen und speichert dessen Wert im private Mitglied - username. Beachten Sie, dass es auch ein friend-Schlüsselwort gibt, das andere Klassen und Funktionen unterscheidet, die auf die private Mitglieder der Klasse zugreifen dürfen. Diese Funktionen können extern sein und gehören nicht zu der oben genannten Klasse. Beachten Sie jedoch, dass die falsche Verwendung von Zugriffsspezifizierern höchstwahrscheinlich zu Compilerfehlern führt.

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

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

class BaseClass {
 public:
  BaseClass() = default;
  explicit BaseClass(string user, string nm)
      : username(std::move(user)), name(std::move(nm)) {}

  ~BaseClass() = default;

  void changeUsername(const string& s) { username.assign(s); };

  string& getUsername() { return username; };
  string& getName() { return name; };

 private:
  string username;
  string name;
};

int main() {
  BaseClass base("buddy", "Buddy Bean");

  cout << "base -> name: " << base.getName() << endl;
  cout << "base -> username: " << base.getUsername() << endl;
  base.changeUsername("jolly");
  cout << "base -> username: " << base.getUsername() << endl;

  exit(EXIT_SUCCESS);
}

Ausgabe:

base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly
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