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.
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.
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.
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.
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.
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?!?!?!
Tags und Links c++ function return-type