Hinter den Kulissen von öffentlich, privat und geschützt

Dec 08 2020

Ich versuche tiefer zu tauchen und die Unterschiede zwischen Public | zu verstehen Privat | In einer niedrigen Perspektive in C ++ geschützt.

Wie werden die Unterschiede zwischen den drei im Gedächtnis ausgedrückt?

Antworten

5 largest_prime_is_463035818 Dec 08 2020 at 20:48

private, publicUnd protectednicht Ursache Mitglieder in bestimmten Bereichen des Speichers gespeichert werden. Der Zugriff wird vom Compiler geprüft. Auf der untersten Ebene gibt es keinen Unterschied.

Zugriffsspezifizierer wirken sich jedoch darauf aus, welche Garantien Sie für die Reihenfolge erhalten, in der die Klassenmitglieder im Speicher angeordnet sind.

Aus dem C ++ 17-Standardentwurf :

Nicht statische Datenelemente einer (nicht gewerkschaftlich organisierten) Klasse mit derselben Zugriffssteuerung (Klausel [class.access]) werden zugewiesen, sodass spätere Mitglieder höhere Adressen innerhalb eines Klassenobjekts haben. Die Reihenfolge der Zuordnung nicht statischer Datenelemente mit unterschiedlicher Zugriffssteuerung ist nicht angegeben (Klausel [class.access]). Anforderungen an die Ausrichtung der Implementierung können dazu führen, dass zwei benachbarte Mitglieder nicht unmittelbar nacheinander zugewiesen werden. Dies kann auch Speicherplatzanforderungen für die Verwaltung virtueller Funktionen ([class.virtual]) und virtueller Basisklassen ([class.mi]) erfordern.

Dies bedeutet, dass für

 struct foo {
     private:
        int x;
     protected:
        int a;
        int b;
     public:
        int m;
        int n;
     private:
        int y;
};

Sie erhalten nur die Garantie, dass im Gedächtnis xvor y, avor bund vor mkommt n. Ansonsten ist die Reihenfolge, in der die Mitglieder im Speicher angeordnet sind, nicht festgelegt.

In seltenen Fällen ist die Reihenfolge der Mitglieder im Speicher jedoch eine nützliche Information. Daher ist es nicht zu falsch zu sagen, dass Zugriffsspezifizierer nichts mit "Low-Level-Speicher" zu tun haben.

2 SergeBallesta Dec 08 2020 at 20:44

Auf der untersten Ebene (Byte-Darstellung von Objekten) gibt es absolut keinen Unterschied zwischen öffentlich, privat und geschützt. Die meisten Compiler können (müssen aber nicht) Mitglieder entsprechend ihrer Sichtbarkeit neu anordnen.

Auf der Zwischenebene (Laufzeitverhalten) gibt es kaum einen Unterschied. Wenn Sie einen öffentlichen Zeiger auf private Daten finden, können Sie ihn sicher verwenden. Dies unterscheidet sich insbesondere von der Konstanz, bei der die Verwendung eines Nicht-Konstanten-Zeigers zum Ändern von Konstanten-Daten explizit ein undefiniertes Verhalten darstellt und SIGSEGV-Fehler verursachen kann.

Der Unterschied ist nur auf höchstem Niveau. Sie können öffentliche Mitglieder von überall aus verwenden, während private Mitglieder nur in der Klasse verwendet werden können, in der sie deklariert sind, und geschützte Mitglieder aus ihrer Klasse und allen Klassen, die sie erben, verwendet werden können. Durch Freundlichkeit können jedoch bestimmte Funktionsklassen auf private oder geschützte zugreifen Daten.

Yunnosch Dec 08 2020 at 20:35

Überhaupt nicht.

Der Zugriff wird vom Compiler "gewährt / verweigert".

Jeder Zugriff, der nicht mit einer geeigneten Sichtbarkeit übereinstimmt (wie von der Klasse des aufgerufenen Objekts gesteuert, über einen Zeiger oder nicht), wird vor dem Erstellen verhindert.

Hinweis:

In den anderen Antworten wird die Auswirkung der Sichtbarkeit auf die Reihenfolge im Speicher sinnvoll erörtert.

Ich beantwortete jedoch die andere Frage, die ich in OPs Beitrag "Wie werden Speicherschutzfunktionen zum Implementieren der Zugänglichkeit / Sichtbarkeit von Mitgliedern verwendet?" Gelesen habe, was in Bezug auf Ursache und Wirkung die umgekehrte Frage ist. Oder nur die Reihenfolge / Strukturierung der Elemente in unterschiedlich konfigurierten Speichern ist das Werkzeug, um den gewünschten Sichtbarkeitseffekt zu erzielen, der wiederum eine bestimmte Reihenfolge der Mitglieder erfordern würde (aber nicht dazu führen würde).

Dh ich sehe keinen Konflikt zwischen Antworten, nur eine andere Interpretation der Frage.