Warum Zugriff auf private möglich?



  • class ab {
    public:
    	void prnt(){
    		std::cout<<priv<<std::endl;
    	}
    	void test(){
    		ab other;
    		other.prnt();
    		other.priv--;
    		other.prnt();
    	}
    private: 
    	int priv;
    };
    
    int main() {
    	ab x;
    	x.test();
    }
    

    Warum geht das?



  • Weil es ok ist.

    Also mal im ernst: ein "Warum geht das?" ist eine Frage die man nicht ernst beantworten kann. Sachen die "gehn" sind fuer die meisten hier voellig normal, deshalb kann keiner erraten, was deiner Meinung nach nicht gehen sollte. Stell deine Frage etwas ausfuehrlicher, beschreib was genau du wissen moechtest, dann wird auch gern geholfen 🙂

    http://www.lugbz.org/documents/smart-questions_de.html



  • Innerhalb einer Methode von ab sind natürlich alle Felder von ab zugreifbar (von allen ab wohlgemerkt, nicht nur von *this).

    EDIT:
    Ansonsten schließe ich mich pumuckl an - ohne die Stichworte im Topic hätte ich garnicht einordnen können was Du willst.



  • Die Überschrift nochmal als Text. Warum ist Zugriff auf private Attribute möglich?

    Ich erstelle ein Objekt x rufe dessen Methode test auf, dort wird ein Objekt other erzeut und ich kann auf die private Attribute von other zugreifen. Nur weil beide von der gleichen Klasse sind? Irgendwie zerstört das doch die ganze Datenkapselung.



  • suleiga schrieb:

    Die Überschrift nochmal als Text. Warum ist Zugriff auf private Attribute möglich? .

    Ganz einfach: Ist es nicht.
    Du greifst auf ein public Member zu (test()). Dieses Member (= Teil der Klasse) darf natürlich auf alle Klassenmember zugreifen (auch auf "privates").

    Mal anders herum: Welchen Sinn hätten private Members, wenn NIEMAND darauf Zugriff hätte ?

    Gruß,

    Simon2.



  • Ich rufe x.test auf und greife da auf other.priv nicht auf x.priv zu. x soll ja auf seine private Attribute zugreifen können, aber nicht auf die von anderen Objekten.

    Anders gefragt: Warum Datenkapselung von Klassen und nicht Objekten abhängig?



  • Hallo

    Damit man zum Beispiel Copy-C'tors schreiben kann ohne für jedes einzelne Attribut nur dafür einen Getter schreiben zu müßen.
    Es wird davon ausgegangen das eine Klasse sich selber trauen kann.

    bis bald
    akari



  • @Simon2

    Mal anders herum: Welchen Sinn hätten private Members, wenn NIEMAND darauf Zugriff hätte ?

    Er meint warum er Zugriff auf die privaten member einer anderen instanz hat. Quasi Instanzuebergreifend internas freigegeben werden.

    Auf seine eigenen ist privaten member ist klar, die haetten wirklich keinen sinn sonst.

    @suleiga

    Nur weil beide von der gleichen Klasse sind? Irgendwie zerstört das doch die ganze Datenkapselung.

    Siehs doch so:

    Du hasst zugriff auf die Klasse, d.h. du kannst sie veraendern und modifizieren, sonst wuerdes du die methode Test ned schreiben koennen.

    Dass heisst auch, du koenntest auch einfach public members schreiben, die die privaten variablen einfach nach aussen geben, dann aenderst nicht mal die datensignatur ... und voiala, dann braucht es den umweg uber die test() methode gar nimmer gehen.

    Wie gesagt, wenn du die klasse unter deiner gewalt hasst, kannst du halt alles, dann gibts nichts mehr zu schuetzen quasi ....
    Und das mit dem instanzuebergreifen ist in c++ halt so, das hat meiner meinung nach keinen nennenswerten nachteil, dafuer aber ne menge vorteile (temp variablen ... etc). Ohne dieses Mechanismus muesstest du viel mehr public machen, was andere user(die keine moglichkeit der manipulation haben) eigentlich gar ned sehen sollen ....

    Und ausserdem waers fuer die Implementation von seitens von c++ auch ned von der Performance trivial. Ob eine Methode, unabhaengig von ihrer instanz, zugriffe bekommt, kann c++ statisch bestimmen, d.h. es wird scho beim compilieren gecheckt. muss er aber erst checken, ob die Instanz (zur Laufzeit erzeugtes Object) selber die quasi "Rechte" hat, wird er das ned mehr statisch koennen sondern wird es zur laufzeit machen muessen, sprich laufzeitcheck & laufzeitfehler = Performance-verlust.

    Ciao ...



  • suleiga schrieb:

    ...
    Anders gefragt: Warum Datenkapselung von Klassen und nicht Objekten abhängig?

    Rrrrrischdig !! 😉

    Gruß,

    Simon2.



  • akari schrieb:

    Hallo

    Damit man zum Beispiel Copy-C'tors schreiben kann ohne für jedes einzelne Attribut nur dafür einen Getter schreiben zu müßen.
    Es wird davon ausgegangen das eine Klasse sich selber trauen kann.

    bis bald
    akari

    Ja, da macht es Sinn.



  • Es verbessert die Datenkapselung, da für bestimmte Operationen zwischen Objekten der gleichen Klasse dann keine Zugriffsfunktionen geschaffen werden müssen.
    Dadurch dass es diese Zugriffsfunktionen nicht gibt kann sie auch keiner ausserhalb der Klasse X misbrauchen.

    Im Prinzip dasselbe wie mir friend.


Anmelden zum Antworten