Warum kann ich private Mitglieder verfügbar machen, wenn ich eine Referenz von einer öffentlichen Mitgliederfunktion zurückgebe?

8

Im Code-Snippet kann ich auf die private Member-Variable außerhalb des Klassenbereichs zugreifen. Obwohl dies nie gemacht werden sollte, warum ist es in diesem Fall erlaubt? Ist es eine schlechte Methode, eine zurückgegebene private Variable als Referenz zu erhalten?

%Vor%

Und was bringt der Rückgabetyp in Bezug auf diese Methode? Und wann sollte ich einen solchen Rückgabetyp haben?

%Vor%

PS: Es tut mir leid, wenn die Betreffzeile vage ist. Kann jemand es auf den hier relevanten Inhalt ändern? Vielen Dank.

    
Mahesh 16.01.2011, 17:13
quelle

5 Antworten

15

private bedeutet nicht, dass "dieser Speicher nur durch Member-Funktionen modifiziert werden kann" - es bedeutet, dass "direkte Versuche, auf diese Variable zuzugreifen, zu einem Kompilierungsfehler führen werden". Wenn Sie einen Verweis auf das Objekt verfügbar machen, haben Sie das Objekt effektiv verfügbar gemacht.

  

Ist es eine schlechte Übung, eine zurückgegebene private Variable als Referenz zu erhalten?

Nein, es hängt davon ab, was Sie wollen. Dinge wie std::vector<t>::operator[] wären ziemlich schwierig zu implementieren, wenn sie nicht einen Verweis auf const zurückgeben könnten. Wenn Sie eine Referenz zurückgeben wollen und nicht wollen, dass Clients sie ändern können, machen Sie einfach a const referenz.

    
Billy ONeal 16.01.2011, 17:27
quelle
3

Die Rückgabe von privaten Mitgliedern als Referenz ist absolut gültig und der Programmierer, der eine Klasse schreibt, ist dafür verantwortlich, sorgfältig zu entscheiden, ob dies erlaubt sein soll. Dieser Link gibt ein Beispiel, wenn dies möglich ist.

    
Donotalo 16.01.2011 17:25
quelle
2

Dieser Code:

%Vor%

Bedeutet, dass die Funktion eine Referenz an eine ganze Zahl zurückgibt. Genau wie beim Übergeben eines Wertes durch Referenz auf eine Funktion, wenn der Rückgabewert von methodTwo geändert wird, wird auch der Wert zurückgegeben, den methodTwo zurückgegeben hat. In diesem Fall das Klassenfeld x .

In dem Code, den Sie geschrieben haben, bedeutet dies, dass Sie die private Variable x ihren Bereich (ein Klassenfeld) verlassen lassen und in der Außenwelt herumgereicht werden. Dies ist sicherlich eine schlechte Übung (weil x in einer Weise geändert werden kann, die die Klasse foo durchbrechen kann, aber es ist sicherlich zulässig.

Denken Sie daran, dass public / private / protected nur zur Kompilierzeit ist. Sobald Ihre Anwendung kompiliert wurde, befinden sich private Felder neben öffentlichen Feldern und es gibt keinen Schutz vor Änderungen. Dasselbe gilt für verwaltete Sprachen wie C # und Java.

Sie sollten es im Allgemeinen vermeiden, Referenzen zurückzugeben, weil es das Ganze verrückt macht - schwer zu verstehen, wenn Konstruktoren / Destruktoren aufgerufen werden. Die Rückgabe einer Referenz kann jedoch schneller erfolgen. Wenn Ihre Methode einen Strukturtyp zurückgab, der RIESIG war, sollte eine Konstante const auf denselben Strukturtyp nur vier bis acht Bytes (ein Zeiger auf das Objekt) zurückgeben. Es gibt jedoch bessere Möglichkeiten, um für diese Art von Dingen zu optimieren.

    
Chris Smith 16.01.2011 17:26
quelle
0

Wie Donotalo sagte, ist es absolut gültig. Die Idee, private Mitglieder zu haben, ist es, anderen Klassen / Funktionen zu verbieten, auf das private Mitglied der Klasse zuzugreifen, ohne Ihre Erlaubnis einzuholen. Wenn Sie gerne eine Funktion erstellen, die es anderen Klassen / Funktionen erlaubt, auf Ihre privaten Mitglieder zuzugreifen, hat der Compiler nichts dagegen: -)

Normalerweise ist es nützlich, ein privates Mitglied zu haben und eine get -Funktion zu haben, damit andere Klassen / Funktionen den Wert der Funktion erhalten, aber nur die Klasse kann sie ändern.

    
Rafid 16.01.2011 17:28
quelle
-1
  

Ich kann auf die private Membervariable außerhalb des Klassenbereichs zugreifen

Wenn Sie sich auf x in main() beziehen, dann ist das anders als% x in class foo . Wenn Sie versuchen, auf obj.x zuzugreifen, wird sich der Compiler definitiv beschweren.

  

Ist es eine schlechte Methode, eine zurückgegebene private Variable als Referenz zu erhalten?

Es ist nichts falsch daran, den Verweis auf ein privates Mitglied zu erhalten. Aber die Verweisung auf ein privates Mitglied macht es privat für nutzlos. Indem Sie eine Variable als privates Mitglied deklarieren, schränken Sie den Zugriff auf dieses Mitglied nur auf die Methoden der Klasse ein.

  

bezüglich dieser Methode, was vermittelt der Rückgabetyp? Und wann sollte ich einen solchen Rückgabetyp haben?

Sie wissen nicht, auf welche Methode Sie sich beziehen?!?!?!

    
yasouser 16.01.2011 17:34
quelle

Tags und Links