371 Stimmen

Was ist der Unterschied zwischen privaten und geschützten Mitgliedern von C++-Klassen?

Was ist der Unterschied zwischen private y protected Mitglieder in C++-Klassen?

Aus den Best-Practice-Konventionen weiß ich, dass Variablen und Funktionen, die nicht außerhalb der Klasse aufgerufen werden, zu private -aber wenn ich mir mein MFC-Projekt ansehe, scheint MFC zu bevorzugen protected .

Was ist der Unterschied und welche sollte ich verwenden?

0 Stimmen

Wenn Sie eine Bibliothek entwerfen, ist jedes geschützte (und nicht private) Mitglied eine Belastung. Wenn Sie bei internen Klassen alles, was nicht öffentlich ist, geschützt machen, sparen Sie Zeit und müssen weniger Klassen überarbeiten, um ein Mitglied von privat in geschützt zu ändern.

2voto

null Punkte 767

Da keine öffentliche Mitgliedsfunktion benötigt wird, um geschützte Mitglieder in der abgeleiteten Klasse zu holen und zu aktualisieren, erhöht dies die Effizienz des Codes und reduziert die Menge an Code, die wir schreiben müssen. Der Programmierer der abgeleiteten Klasse muss sich jedoch bewusst sein, was er da tut.

0 Stimmen

Sie können immer eine Inline-Funktion verwenden, die in der Klassendeklaration implementiert ist. Der Compiler optimiert das weg (und das wäre z.B. eine gute Möglichkeit, den Nur-Lese-Zugriff auf eine private Mitgliedsvariable zu erzwingen).

0 Stimmen

@PaulSanders inline != weg optimiert. Compiler kann Funktionen, die nicht als inline markiert sind, inline schalten und umgekehrt.

0 Stimmen

@MattF. Ich meinte nicht die Verwendung des inline Stichwort. Ich meinte damit, die Implementierung in die Header-Datei zu stellen, so dass der Compiler sie sehen und daher einbinden/optimieren kann (obwohl man heutzutage die Link-Time-Optimierung aktivieren kann, um das Gleiche zu tun).

2voto

Darshan Rajgor Punkte 21

Privat: Zugriff durch Klassenfunktionen und Freundesfunktionen oder Freundesklassen. Bei C++-Klassen ist dies der Standard-Zugriffsspezifizierer.

Geschützt: Zugriff durch Klassenfunktionen, Freundesfunktionen oder Freundesklassen und abgeleitete Klassen.

  • Sie können Klassenvariablen oder Funktionen (sogar Typdefs oder innere Klassen) je nach Bedarf als privat oder geschützt kennzeichnen.
  • Die meiste Zeit halten Sie Klassenmitglied als private und fügen Sie get / set-Funktionen zu kapseln. Dies hilft bei der Wartung des Codes.
  • Private Funktionen werden im Allgemeinen verwendet, wenn Sie Ihre öffentlichen Funktionen modular halten oder wiederholten Code eliminieren wollen, anstatt den gesamten Code in eine einzige Funktion zu schreiben. Dies hilft bei der Wartung des Codes.

Siehe diesen Link für weitere Einzelheiten.

2voto

Barmak Shemirani Punkte 29381

private wird für Mitgliederdaten bevorzugt. Mitglieder in C++-Klassen sind private standardmäßig.

public wird für Mitgliederfunktionen bevorzugt, obwohl dies Ansichtssache ist. Zumindest einige Methoden müssen zugänglich sein. public ist für alle zugänglich. Sie ist die flexibelste und sicherste Option. Jeder kann sie nutzen, und jeder kann sie missbrauchen.

private ist überhaupt nicht zugänglich. Niemand kann sie außerhalb des Unterrichts verwenden, und niemand kann sie missbrauchen. Nicht einmal in abgeleiteten Klassen.

protected ist ein Kompromiss, weil es in abgeleiteten Klassen verwendet werden kann. Wenn Sie von einer Klasse ableiten, haben Sie ein gutes Verständnis der Basisklasse, und Sie sind vorsichtig, um diese Mitglieder nicht zu missbrauchen.

MFC ist ein C++-Wrapper für die Windows-API, es bevorzugt public y protected . Klassen, die vom Visual Studio-Assistenten erzeugt werden, haben eine hässliche Mischung aus protected , public y private Mitglieder. Aber es gibt eine gewisse Logik in den MFC-Klassen selbst.

Mitglieder wie SetWindowText sind public weil Sie oft auf diese Mitglieder zugreifen müssen.

Mitglieder wie OnLButtonDown behandelt die vom Fenster empfangenen Benachrichtigungen. Auf sie sollte nicht zugegriffen werden, daher sind sie protected . Sie können in der abgeleiteten Klasse weiterhin auf diese Funktionen zugreifen und sie außer Kraft setzen.

Einige Mitglieder haben mit Threads und Nachrichtenschleifen zu tun, auf sie sollte nicht zugegriffen werden oder sie sollten nicht überschrieben werden, daher werden sie als private

In C++-Strukturen sind die Mitglieder public standardmäßig. Strukturen werden in der Regel nur für Daten und nicht für Methoden verwendet, daher public Deklaration als sicher gilt.

1 Stimmen

Sie schreiben "Mitglieder in C++-Klassen sind standardmäßig geschützt". Nach dem Standard sind sie standardmäßig entweder privat oder öffentlich, je nachdem, welches Schlüsselwort in der Definition verwendet wurde (14p3). Weicht Microsoft hier von der Norm ab?

0 Stimmen

@AlexanderKlauer Ich habe mich geirrt, es ist private standardmäßig in Visual Studio. Es ist private standardmäßig auch in gcc, es ist nie public standardmäßig. Es sei denn, ich liege wieder falsch. Ich kann die Norm, auf die Sie sich beziehen, nicht finden.

0 Stimmen

Entschuldigung, ich hätte mich genauer ausdrücken sollen. Ich bezog mich auf den C++ 17-Standard. Der C++ 11-Standard hat den gleichen Wortlaut in 11p3. Könnten Sie Ihre Antwort aktualisieren? Vielen Dank!

1voto

Tutu Kumari Punkte 427
  • Privat : Es ist ein Zugriffsbezeichner. Standardmäßig sind die Instanzvariablen (Member) oder die Methoden einer Klasse in C++/Java privat. Bei der Vererbung werden der Code und die Daten immer vererbt, sind aber außerhalb der Klasse nicht zugänglich. Wir können unsere Datenmitglieder als privat deklarieren, damit niemand direkte Änderungen an unseren Mitgliedsvariablen vornehmen kann, und wir können öffentliche Getter und Setter bereitstellen, um unsere privaten Mitglieder zu ändern. Und dieses Konzept wird immer in der Geschäftsregel angewendet.

  • Geschützt : Es ist auch ein Zugriffsbezeichner. In C++ sind die geschützten Mitglieder innerhalb der Klasse und der geerbten Klasse zugänglich, aber nicht außerhalb der Klasse. In Java sind die geschützten Mitglieder innerhalb der Klasse, für die geerbte Klasse sowie für alle Klassen innerhalb desselben Pakets zugänglich.

0voto

mujtaba Punkte 11

Auf ein geschütztes nichtstatisches Basisklassenmitglied können Mitglieder und Freunde aller von dieser Basisklasse abgeleiteten Klassen zugreifen, indem sie eine der folgenden Möglichkeiten nutzen:

  • Ein Zeiger auf eine direkt oder indirekt abgeleitete Klasse
  • Ein Verweis auf eine direkt oder indirekt abgeleitete Klasse
  • Ein Objekt einer direkt oder indirekt abgeleiteten Klasse

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X