Frage bezüglich Zugriffsrechten
-
#include <iostream> #include <cstring> using namespace std; class String { private: char *buffer; unsigned int len; public: String(const char* s="") { len = strlen(s); buffer = new char[len +1]; strcpy(buffer, s); } ~String(){delete [] buffer;} String(const String & s) { len = s.len; buffer = new char [len +1]; strcpy(buffer, s.buffer); } char *get_String() const {return buffer;} }; int main(void) { String string1("Adam"); cout << string1.get_String() << "\n"; return 0; }Ich bin ein Anfänger und kämpfe gerade mit Klassen und Objekten. Mit der folgenden Frage habe ich gerade Probleme. Beim Kopierkonstruktor sieht man den folgenden Ausdruck. len = s.len; Allerdings ist len als private markiert. Deswegen verstehe ich nicht wieso ich darauf Zugriff habe. Selbst wenn der Zugriff aus einem String Objekt erfolgt, so handelt es sich doch um einen Zugriff auf ein anderes String Objekt, welches als Referenz mit dem Kopierkonstruktor übergeben wird. Das gleiche Verhalten habe ich schon beim Überladen von Operatoren beobachtet. Wieso verstehe ich allerdings nicht.
Wenn ich richtig liege, dann wäre eine ähnlich Funktion beim main() unmöglich.
Kann man somit aus einem Objekt auf ein anderes Objekt der selben Klasse immer zugreifen, selbst wenn es sich dabei um private Methoden handelt?Für die Antwort danke ich im voraus.
-
Zugriffsrechte beziehen sich in C++ auf Klassen.
-
Das habe ich um ehrlich zu sein nicht verstanden.
-
Das beantwortet deine letzte Frage mit: Ja
-
Dann bedanke ich mich für die schnelle Antwort.
-
Du kannst von außerhalb der Klasse nicht auf private Member zugreifen, sondern nur auf die öffentlichen Member, also die Schnittstelle.
Die öffentlichen Member selber, also Elementfunktionen oder auch Konstruktoren wie der Kopierkonstruktor können natürlich auf die privaten Member zugreifen.
Wer soll den sonst drauf zugreifen können:D
Lg freeG
-
Das richtige Wort ist Sichtbarkeit, nicht Zugriffsrecht. In einem Haus sehe ich alles was drinnen ist, von draussen nur das am Fenster.
-
Datenkapselung nennt man das Ganze auch. Auf private Member hat nur die Klasse selbst zugriff. Lies dich etwas in OOP ein, dann wird dir das schnell klar...
Omicron
-
Mal was ganz anderes: Deiner Klasse fehlt ein Zuweisungsoperator.
String foo = "foo"; // Kopier-Initialisierung, OK String bar = "bar"; // Kopier-Initialisierung, OK foo = bar; // Zuweisung! --> foo.buffer == bar.buffer Ooops!
-
knivil schrieb:
Das richtige Wort ist Sichtbarkeit, nicht Zugriffsrecht. In einem Haus sehe ich alles was drinnen ist, von draussen nur das am Fenster.
Das richtige Wort ist Zugriffsrecht. Private Member sind für jeden sichtbar. Ihr Name kann aber nur von Membern und Freunden der Klasse (der Klasse, nicht nur des jeweiligen Objekts) verwendet werden.
Dass privates von aussen sichtbar ist, spielt an ein paar Stellen ein Rolle. z.B. müssen Parametertypen deklariert sein, auch wenn sie nie jemand von aussen benutzen kann und wird. Außerdem führt die Sichtbarkeit dazu, dass private Methoden bei der Namensauflösung brücksichtigt werden. Da name lookup und overload resolution vor der Prüfung der Zugriffsrechte stattfindet kann es zu recht überraschenden Compiler Fehlern kommen.class A { public: void f(float); private: void f(int); }; int main() { A a; a.f(0); // wählt f(int) auch wenn f(float) gehen würde // -> kein zugriff retunr 0; }
-
Die erstbeste Quelle: http://en.wikipedia.org/wiki/Class_diagram , http://de.wikipedia.org/wiki/Klassendiagramm unter Members.
-
Da geht es um UML.
Ich weiß jetzt keinen Link. Es müsste aber eigentlich ein gotw dazu geben. Es gibt zumindest in "Exp. C++ Style" mindestens ein Item darüber.
Privates ist in C++ sichtbar, es sei denn man pimpled es weg oder versteckt es irgendwie anders.
-
brotbernd schrieb:
Da geht es um UML.
Ich weiß jetzt keinen Link. Es müsste aber eigentlich ein gotw dazu geben. Es gibt zumindest in "Exp. C++ Style" mindestens ein Item darüber.
Privates ist in C++ sichtbar, es sei denn man pimpled es weg oder versteckt es irgendwie anders.Ich pimpel dich auch gleich weg.
-
krümelkacker schrieb:
Mal was ganz anderes: Deiner Klasse fehlt ein Zuweisungsoperator.
String foo = "foo"; // Kopier-Initialisierung, OK String bar = "bar"; // Kopier-Initialisierung, OK foo = bar; // Zuweisung! --> foo.buffer == bar.buffer Ooops!Genau, da hat Krümelkacker recht.
Merk dir die "großen drei" oder die "dreier Regel" welche besagt, dass man entweder Destruktor, Kopierkonstruktor und Zuweisungsoperator nicht selber erstellen braucht und die compilergenerierten verwenden kann, oder man muss alle drei selber erstellen.
Muss man einen selber erstellen, sind die anderen beiden eigentlich auch so gut wie immer von nöten( Ausnahme ist ein virtueller Destruktor in der Basisklasse).
Man braucht sie eigentlich immer, wenn man dynamisch Speicher zuweißt, also mit Zeigern rumhantiert.Hoffe konnte dir helfen.
Lg freeG