Warum kann ich aussetzen, private Mitglieder, wenn ich wieder ein Verweis aus einem öffentlichen member-Funktion?
In der code-snippet, ich bin in der Lage, Zugriff auf die privaten member-variable außerhalb der Gültigkeitsbereich der Klasse. Aber dies sollte nie getan werden, warum ist es erlaubt in diesem Fall? Ist es eine schlechte Praxis zu erhalten zurückgegeben private variable per Referenz ?
#include <iostream>
#include <cstdlib>
class foo
{
int x;
public:
foo(int a):x(a){}
int methodOne() { return x; }
int& methodTwo() { return x; }
};
int main()
{
foo obj(10);
int& x = obj.methodTwo();
x = 20; //With this statement, modifying the state of obj::x
std::cout << obj.methodOne();
getchar();
return 0;
}
Und in Bezug auf diese Methode, was bedeutet der return-Typ mitteilen ? Und auch wenn ich das zurück geben von dieser Art ?
int& methodTwo() { return x; }
PS: es tut mir Leid, wenn die Betreffzeile ist vage. Kann jemand es ändern, um die relevanten Inhalte hier. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
private
bedeutet nicht, dass "diese Erinnerung kann nur geändert werden durch die member-Funktionen" - es bedeutet "direkt versucht, auf diese variable ergibt einen compile error". Wenn Sie setzen einen Verweis auf das Objekt haben Sie effektiv ausgesetzt das Objekt.Nein, es hängt davon ab, was Sie wollen. Dinge wie
std::vector<t>::operator[]
wäre sehr schwierig zu implementieren, wenn Sie nicht zurückkehren konnten, eine nicht-const
Referenz 🙂 Wenn Sie wollen, um wieder eine Referenz und nicht möchten, dass clients in der Lage sein, um es zu ändern, einfach machen es einemconst
Referenz.std::vector
-- aber es gibt viele Fälle, in denen es die falsche Sache zu tun.Rückkehr der privaten Mitglieder, die als Referenz durchaus gültig ist und der Programmierer, der schreibt eine Klasse verantwortlich ist, sorgfältig zu wählen, wenn dies erlaubt werden sollte. Dieser link gibt ein Beispiel, wenn dies getan werden kann.
Diesem code:
Bedeutet, dass die Funktion einen Referenz in eine Ganzzahl. Gerade wie, wenn Sie einen Wert per Referenz an eine Funktion, wenn der return-Wert von
methodTwo
verändert wird, so bedeutet der Wert, dassmethodTwo
zurückgegeben. In diesem Fall class-Feldx
.In dem code, den Sie geschrieben haben, bedeutet dies, dass Sie lassen die private variable
x
entziehen Geltungsbereich (a-Klasse-Feld) und weitergegeben werden, um draußen in der Welt. Dies ist sicherlich eine schlechte Praxis (weilx
geändert werden können, in einer Weise, die möglicherweise brechen Klassefoo
, aber es ist sicherlich zulässig.Erinnern public/private/protected sind compile-Zeit nur. Sobald Ihre Anwendung kompiliert wird, die private Felder befinden sich neben den öffentlichen Bereichen und es gibt keinen Schutz vor änderungen. Das gleiche gilt für managed-Sprachen wie C# und Java.
Sollte man generell vermeiden Rückkehr Referenzen, denn Sie macht es toll-schwer zu verstehen, wenn Konstruktoren/Destruktoren aufgerufen. Allerdings, Rückgabe einer Referenz kann schneller sein. Wenn Ihre Methode zurückgegeben wird ein struct-Typ, der war RIESIG, die RÜCKFÜHRUNG einer const-Referenz auf das selbe struct-Typ sollte nur nehmen Sie vier-bis-acht-Byte (einen Zeiger auf das Objekt). Es gibt jedoch noch bessere Möglichkeiten zur Optimierung für diese Art der Sache.
Wie Donotalo gesagt, es ist vollkommen gültig. Die Idee, private Mitglieder ist, dass andere Klassen/Funktionen Zugriff auf die privaten member der Klasse ohne Ihre Berechtigung. Wenn Sie glücklich sind, um eine Funktion zulassen, dass andere Klassen/Funktionen Zugriff auf Ihre privaten Mitglieder, der compiler hat nichts dagegen, dass sich wirklich 🙂
In der Regel ist es sinnvoll, einen private-Mitglied und haben eine bekommen - Funktion, damit andere Klassen/Funktionen, um den Wert der Funktion, sondern nur die Klasse wird in der Lage sein, es zu ändern.
Wenn Sie beziehen sich auf die
x
immain()
dann, die Verschieden von derx
erklärt inclass foo
. Wenn Sie versuchen, Zugriff auf dieobj.x
dann der compiler wird auf jeden Fall beschweren.Es ist nichts falsch in "Empfang" der Verweis auf einen privaten member. Aber gibt die Referenz auf ein privates Element zu deklarieren private nutzlos. Durch die Deklaration einer variable zu einer privaten member-Schränken Sie den Zugriff nur für Mitglieder der Klasse' Methoden.
Nicht sicher, welche Methode Sie sich beziehen?!?!?!
std::vector<t>::operator[]
dann? Was auch immer Zeiger auf den Puffer der Vektor ist nicht in der Welt ausgesetzt, aber die Daten (und sollte, in Anbetracht der Punkt des Vektors)